范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

用GO语言写一个数据库连接池

  池(Pool)是指某类资源的容器,它是一种用于提高程序效率和降低系统开销的技术,比如线程池、连接池、内存池、对象池。但它们的核心理念一致: 资源复用 。
  本文主要探究数据库连接池的相关问题,并实现一个简单的Go版本连接池Demo,希望能对读者理解池技术有些帮助。
  数据库连接池的基本思想就是为数据库连接建立一个缓冲池,预先在缓冲池中放入一定数量的数据库连接,当用户需要访问数据库时,从池中取出一条空闲连接,使用完毕后,将该连接返回到池中,以供其他的请求访问使用。
  为什么需要数据库连接池?
  首先,需要明确的是, 数据库连接是一种有限的、昂贵的资源 。如果按照单个连接来进行数据库操作,在高并发的情况下会导致数据库连接数耗尽的问题,并且单个连接的频繁创建和关闭,会极大地增加数据库的开销。例如,mysql数据库可通过以下mysql命令查看其设置的最大连接数。
  show variables like "%max_connections%";
  而数据库连接池负责分配、管理和释放数据库连接,它允许客户端请求复用现有的数据库连接,而不是重新建立一个。
  核心概念
  1. 连接数
  连接池中应该放置多少连接,才能使系统的性能最佳?系统可通过设置最小连接数和最大连接数等参数来调整。
  最小连接数
  最小连接数是连接池空闲状态下维持的数据库连接数,也是系统启动时连接池所创建的连接数。创建过多,则系统启动就会较慢,且如果应用程序对数据库连接的使用量不大,会造成数据库连接资源的浪费。如果创建过少,则系统启动较快,但后续对请求的响应就会较慢。
  最大连接数
  最大连接数,是连接池能申请的最大连接数。超过最大连接数的请求,将加入等待队列中,当池中有可用连接时,再处理这些请求。
  最小连接数的设置,可根据系统正常访问量的大小来确定一个合适的数值;而最大连接数,则可根据高峰场景下的系统访问量来设置。
  2. 空闲时间
  当连接请求超过最小连接数时,在超过后的连接请求需要连接池为它们建立新的连接,但是总的连接数不能超过最大连接数限制。对于这些大于最小连接数的数据库连接在使用完后不会被马上释放,它将被放在连接池中等待重复使用或者超过设定的空闲时间后被释放。
  Demo实现
  定义数据库连接池对象Pool
  type   Pool  struct   {
  mu sync.Mutex
  minConn  int    // 最小连接数
  maxConn  int    // 最大连接数
  numConn  int    // 池已申请的连接数
  conns  chan   *DBConn  //当前池中空闲连接实例
  close    bool
  }
  // 初始化池实例
  func    NewPool  (min, max  int  ) * Pool   {
  p := &Pool{
  minConn: min,
  maxConn: max,
  numConn: min,
  conns:  make  ( chan   *DBConn, max),
  close  :  false  ,
  }
  for   i :=  0  ; i < min; i++ {
  p.conns <- NewDBConn()
  }
  return   p
  }
  模拟数据库连接对象DBConn
  type   DBConn  struct   {
  idleTime  int    // 标记该数据库连接空闲时间
  }
  // 新建数据库连接
  func    NewDBConn  () * DBConn   {
  return   &DBConn{idleTime:  0  }
  }
  // 关闭数据库连接
  func   (d *DBConn)  Close  () {}
  池对象方法定义
  // 从池中取出连接
  func   (p *Pool)  Get  () * DBConn   {
  if   p. close   {
  return    nil
  }
  p.mu.Lock()
  defer   p.mu.Unlock()
  if   p.numConn >= p.maxConn || len(p.conns) > 0 {  // 保证了池申请连接数量不超过最大连接数
  d := <-p.conns  // 若池中没有可取的连接,则等待其他请求返回连接至池中再取
  return   d
  }
  p.numConn++
  return   NewDBConn()  //申请新的连接
  }
  // 将连接返回池中
  func   (p *Pool)  Put  (d *DBConn) {
  if   p. close   {
  return
  }
  p.mu.Lock()
  defer   p.mu.Unlock()
  p.conns <- d
  }
  // 关闭池
  func   (p *Pool)  Close  () {
  p.mu.Lock()
  defer   p.mu.Unlock()
  for   d :=  range   p.conns {
  d.Close()
  }
  p. close   =  true
  }
  (左右滑动查看完整代码图片)
  考虑代码篇幅原因,本Demo并没有实现释放空闲超时的数据库连接功能,即没有对p.numConn做--计数和Pool的RemoveConn方法。实际情况中,设计连接池,还有很多因素需要考虑,例如:
  超时移除 :当池中空闲的连接数大于最小连接数时,应当对数据库连接进行空闲超时检查,当满足要求时,释放该条连接,并从池中移除。但最终在池中维持的数据库连接条数应该等于最小连接数。  连接可用 :对池中的数据库连接建立保活机制,保证每条连接是可用的。  事务处理 :由于事务的原子性,一组sql语句要么全做,要么全不做。如果简单采用连接复用的策略,就会发生问题,因为没有办法控制属于同一个事务的多个数据库操作方法的动作,可能这些数据库操作是在多个连接上进行的,并且这些连接可能被其他非事务方法复用。为此可以使用每一个事务独占一个连接来实现,虽然这种方法有点浪费连接池资源,但可以大大降低事务管理的复杂性。

买到就是赚到!steam最广受好评的十款游戏求生之路224万好评好评率95。69求生之路2已经是一款有着十年历史的老游戏了,但它依然是如今最受欢迎的第一人称射击游戏之一。游戏本身具有许多优良品质外,如优秀的射击手感和近战武器无人深空还活着?制作人宣布夏季公布新章节没有男人的天空这款游戏因为最初的画饼过大差点成为骗局而出名,当时辱骂攻击游戏和制作者的甚至成为了一种政治正确。就连很多完全不关注电子游戏的人,也都对无人深空的惨状略知一二。但是之后百里守约克星诞生,伽罗后羿也打不过,这13888射手天克版本之子在王者荣耀中,射手英雄受到广大玩家的热情追捧,射手英雄的输出能力是最强的,特别是在队伍中有辅助肯死保的情况下,一场比赛下来拿个一二十人头,也是很正常的事。射手英雄自身一般都很脆皮,吞食天地版的封神榜,这不正是小时候最期盼的版本吗?80后小时候的智力卡游戏有几款还是被玩家铭记于心,一直思考的问题就是这些游戏凭什么被认为是经典,像重装机兵吞食天地第二次机器人大战等等,得出的结论居然是,这些游戏都有汉化过的版本,王者荣耀诸葛亮被动重做,马可波罗加强,典韦老夫子大加强王者新情报,三锤来爆料!王者荣耀在体验服对4位英雄进行了调整,分别是诸葛亮马可波罗老夫子典韦,其中,诸葛亮的调整重点在于被动技能近乎重做般的调整,而其余三位英雄都是正向加强向的调整外挂已然满天飞?各种作弊技能已出现,主播能否坚守本心?之前永劫无间这款,武侠吃鸡类游戏,由于测试环节的缘故,所以在Steam上,免费上架了一周,这可让很多游戏爱好者,非常的兴奋,因为它算是流星蝴蝶剑的精神续作,当中畅爽的打斗感,和新颖吃鸡同样是氪金无底洞!和平精英大数据杀熟,外服却送真车从刺激战场到和平精英,吃鸡手游的氪金程度远超玩家们的想象,像极了一个吸金的无底洞!每款游戏都有不同程度的氪金,但能把抽奖发挥到极致的只有吃鸡手游,而且还时常被其他游戏模仿。随着三款大话西游2是否有玩家能做到仙法鬼火和人法全部抗满的情况?你见过没有?如今的大话西游2玩家们不仅仅注重装备是否高级,哪怕是六阶仙器傍身,你的属性不太好看也同样没什么作用。一些完美的属性抗性,对于很多喜欢追求极限的玩家来说,简直就像是强迫症良药一般,看把画面和手感做到极致的横版动作游戏奥日与鬼火意志奥日与鬼火意志是由MoonStudios开发的奥日与黑暗森林的第二部游戏,游戏有着绝美独特的画风,玩到停不下来的优秀机制,以及电影般的叙事风格很明显,第二代也很好地继承了这些优点,大话西游2绝版灵性鬼火回血展示两套装备弑神江湖灵性鬼火男鬼装备展,加上一套不错的回血,这男鬼足以浪迹各大PVE场合了吧?先上鬼火套,大家看看这位的搭配如何,是否合理克水狂暴刀,这刀真心不错!一套传世寒鸦绝版灵性鬼火套低克高狂暴CF冠军狙击手靠生化练狙?狼王Wolf亲自教观众狙击技巧在CF中如果说哪一种武器威力最大,相信很多人都会说狙击。这种武器虽然一发一个,玩家们多多少少都可以瞬一下,但真正在排位或者战队赛中,不是专业的狙位不会轻易使用,生怕坑到队友。玩家为
剑与远征囤囤鼠开仓了,4000紫碎难出一张神魔,狗粮吃到饱新一期的秘宝峡湾在先遣服已经正式开启,玩家完成关卡条件可以获得不错数量的精英英雄灵魂石奖励。在游戏中虽然有着不少的英雄获取来源,但大部分都需要资源进行兑换或者抽取。而紫碎也一样,获剑与远征先遣服更新,新恶魔上线,团本开启新地图,三路超震撼先遣服比正式服版本更新会早上几天,所以玩家们很多消息来源都是通过先遣服的爆料,每一次版本更新后,游戏中总会迎来新的内容,这一次也不例外。对于玩家来说其实已经有了一些准备了,上新的很剑与远征萌夏盛果兑换指南,老玩家首选红瓜子,萌新秒选神魔众所周知剑与远征作为放置类的手游,玩法的核心就是推图和打种族塔以及各种副本,只有随着关卡的提升,才会解锁更多有趣的玩法。但想要快速的提升自己的实力和等级卡池,需要耗费大量的资源,这迷你世界铁围栏也能做跑酷?这届粉丝很优秀,羊纸真的太难了在迷你世界中存在着超多的游戏模式,仅联机大厅的地图就存在着跑酷解密像素画对战等一系列的玩法,当然还有传统的冒险生存玩法以及发挥自己脑洞的创造模式。对于大部分选手来说创造模式只需要玩和平精英主播光影冒险最强套路,亮剑玩法又来了,太有喜感了众所周知和平精英在海岛中上线了全新的玩法元素光影冒险,在其中玩家不仅可以体验到坦克车,还有吊威亚蹦床以及过山车等一系列的趣味玩法,有的玩家利用这个玩法机制,在光影工厂开发各种有趣的剑与远征钻石别乱花,3000给团本,奖励差距明显,占星才是大头剑与远征中有着几大活动是玩家非常喜欢的,一是带神魔奖励的,例如演武试炼还有刚结束的夏末余韵,还有一种则是带有占星奖励的活动。团本一直是非常具有话题性的活动,但是上线的次数不多,同时荒野乱斗流彩阿拾很拉胯?玩家星徽妙具拉满,连胜根本停不下来荒野乱斗全新赛季更新后,很多玩家都满心欢喜地冲杯和完成任务,只为了获得更多的奖章用来解锁宝箱和其他的奖励。随着时间的推移,很多玩家从乱斗金券中拿到了足够多的宝石,又可以解锁一波乱斗和平精英主播挑战手雷吃鸡,近战比冲锋还好用,对手直接被炸懵和平精英作为吃鸡手游,独特的游戏机制加上超大超复杂地图环境,给玩家带去了无尽的快乐。为了让玩家有更好的游戏体验,光子在更新上线新元素模式的同时,也会同步增加新的载具和武器装备,现在王者荣耀被动技能堪比大招?四位英雄失去被动连超级兵都打不过王者荣耀到目前为止已经来到了S24赛季,虽然已经上线了那么长时间,但是游戏热度依旧不减当年。游戏中正式上线的英雄已经超过了百位,在这100多位英雄中,每一位英雄都是一个十分特别的存荒野乱斗玩家随手开宝箱,点开第二个道具不淡定了,欧皇附体?荒野乱斗作为一款现象级的对战手游,其中的游戏模式十分丰富,有的玩家喜欢单打独斗的荒野决斗模式,还有的玩家喜欢和队友配合一起上分,体验足球和组队的乐趣但无论什么模式,都需要玩家们有着剑与远征迷宫扫荡遇上新活动,玩家表示头大,半神奖励不好拿?剑与远征目前有着非常多的活动正在火热进行中,而新出的协战深渊活动对于新手玩家来说更是一大福利。玩家们可以通过组建队伍,共享英雄一起挑战深渊迷宫,也可以使用队友的通关记录直接扫荡迷宫