专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

用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语句要么全做,要么全不做。如果简单采用连接复用的策略,就会发生问题,因为没有办法控制属于同一个事务的多个数据库操作方法的动作,可能这些数据库操作是在多个连接上进行的,并且这些连接可能被其他非事务方法复用。为此可以使用每一个事务独占一个连接来实现,虽然这种方法有点浪费连接池资源,但可以大大降低事务管理的复杂性。

冯提莫参加脱口秀大会,实力回击质疑,佛系少女现场梗不断脱口秀大会是一档由于谦吴昕李诞等综艺大咖领衔,用笑点暴击痛点,用幽默跟生活和解的一档脱口秀节目。在8月18日新一集的节目中,制作组邀请到了歌手冯提莫作为本期嘉宾。虽然是第一次登上脱视听盛宴,打脸质疑!冯提莫重庆无界演唱会圆满落幕8月3日,知名主播冯提莫的首场个人演唱会无界在重庆人民大礼堂成功举办。这是她的第一场个唱。甜美清新的歌声搭配现场顶级的音响和舞台效果,让到场的观众和粉丝享受到了一场精彩的音乐盛宴。萌新的我,抱到大佬大腿后,在末日世界中体验到了城市生活近期总听说末日生存手游明日之后有了大变化,明日之后新上任的策划各种骚操作层出不穷,铁了心要搞事情,于是小编也就想凑热闹去体验下。前一段时间大迁徙事件在玩家之间闹得沸沸扬扬,甚至还和暴雪游戏掀起复古潮,炉石传说回归经典这才是最初的样子作为暴雪与理查德A纳克合作共同创造的宏大世界,魔兽世界的世界观一直是暴雪的金字招牌,也是无数玩家魂牵梦绕的第二宇宙。在暴雪早期运营时,魔兽争霸和魔兽世界为我们塑造了无数的英雄和他们炉石传说新版本憋大招,来看奥丹姆奇兵新卡怎么玩距离炉石传说新版本奥丹姆奇兵发布还有一周的时间,新的故事将发生在神奇的奥丹姆,一片充满神秘和宝藏的土地。7月30日中午,暴雪官方的喉舌媒体们再一次发布了一批新卡的相关信息。让我们一唱征服吃猪蹄左拥右抱,玩家说好的炉石传说双人竞速赛呢?6月19日,由暴雪官方组织的全新的竞赛类节目炉石传说双人竞速赛怪盗训练营篇正式开启开启。八位主播将两两组队,在24小时内挑战炉石传说冒险模式达拉然大劫案的英雄难度,并依照他们的通关造梗还得是暴雪家啊!炉石传说新卡描述快被玩坏了随着炉石传说奥丹姆奇兵新卡牌的全部公布,距离新版本上线的日子也越来越近了。目前奥丹姆奇兵版本的游戏内容已经在游戏里预装,只等8月7日正式开放。以往每次版本更新,玩家们最关注的都是新托奇狂野合集超低价格上架,暴雪叕要花式特惠了6月18,又到了剁手的时候。年中狂欢到来,各大电商和游戏平台都进行了力度很大的促销。作为经常促销界活动的带头大哥,暴雪这次依旧身先士卒,针对一系列旗下游戏展开优惠活动。其中对于热爱玩不动暗黑4的剧情?双十一特惠,暴雪霸霸让你不错过夺魂之镰在2019年底举行的暴雪嘉年华开幕式活动中,官方正式公布了新作暗黑破坏神4!并宣布本作将登陆PCPS4XboxOne平台。一时间全球的暗黑粉丝欢呼雀跃,国内外玩家翘首以盼。殁天使玛指尖江湖宽窄巷子开大会,玩家怀疑郭炜炜另有所图完了要长胖了要说哪座城市与西山居交集最深,不得不说与剑网3数次结下不解之缘的成都。无论是18年元宵节西山居举办的神行成都游园会活动,以浓郁的古风氛围和独具特色的美食文化与众多江湖儿女结缘。还是指尖江湖E3引热议,上线即爆满6月11日,2019年的E3游戏展正式开始举行。作为全世界游戏爱好者一年一度的游戏盛会,各大知名游戏厂商都会携自己旗下的大作赴会展出。身为国内老牌游戏厂商的知名代表之一,西山居此次
梦幻西游玩家被主播看不起,亮出藏宝阁底牌,瞬间让对方道歉人不可貌相,海水不可斗量。我们不能从外表去评价任何人,因为有些人很有实力却不喜欢显摆,所以从外表是看不出来的。在梦幻西游这款游戏里面也是一样,虽然绝大多数土豪玩家都是喜欢炫富的,但Timberborn攻略Timberborn是一款木匠朋克风格的城市建造模拟游戏,以人类灭绝后的海狸社会为背景,但一些物种仍然存活下来,继续进化。在游戏中玩家化身为海狸协会的会长,你需要选择一支海狸种族,舅舅党称使命召唤2022将有彩六围攻攻防模式近期有关使命召唤2022新作的传言四起,包括游戏记者TomHenderson爆料的DMZ模式和背景设定在拉美,现在另一位舅舅党RalphsValve声称使命召唤2022新作将有类似IG成最年轻战队!LPL五大年龄最小队伍出炉RNG处于中等水平各位LPL的观众和英雄联盟召唤师大家好,这里是天下游戏汇。LPL去年年底的转会期是历史上最罕见的一次,原因是在这次的转会期中,除了EDG战队之外,其他所有16支战队都有人员上的变动师父IGN上手前瞻年龄影响玩法的独特设计你变老了,也更强了师父将于2022年2月8日发售,在此之前,我首次上手体验了这款游戏的早期试玩版本,这也解答了游戏公布首支预告片以来,我一直在思考的一个问题没错,师父的战斗体验玩起曹操可爱的奸雄,他的梗让你欲罢不能三国历史人物众多,关羽关云长的忠义,常山赵子龙七进七出的勇猛,生子当如孙仲谋的孙权,鞠躬尽瘁的诸葛亮众多顶级人物让三国的历史更加绚丽多彩。但当下,最受偏爱的无疑是曹操,因为他是一个XYG冲进泉水虐杀TES,湘军脸色铁青,网友不当人,没电竞精神这场比赛是XYGvs长沙TES。A,虽然现在两支战队都晋级了冬季挑战者杯八强,但是这场比赛对两支战队来说一样挺重要的,因为这场比赛赢了的那支队伍士气会更旺一些,就能更好应对之后的淘一梦江湖少侠日记即将上线?玩家期待拉满这就抢锣敲相信很多人都有记日记的习惯,日记可以记录大家在过去的日子中,都做过遇到过哪些有趣的事情。毕竟人总是会忘记各种事物,但是记在纸上的一切可不会消失。放到以后那是一份有趣回忆。但是在游戏上汽大众ID。西北杯王者荣耀大赛首战即高燃,强势进击4强赛!要问当下最受大众追捧的手游是什么?能够让男生不理女友,能让女生弃追韩剧当然非王者荣耀莫属了!王者荣耀作为当下最受欢迎的游戏,百余种游戏角色自由选择,让无数人在虚拟世界获得了难得的自2022年1月NS游戏发售表宝可梦传说阿尔宙斯最受期待大家好,今天带来的是2022年第一篇发售表。推荐度采用星星表示,最高五颗。如有遗漏和错误以及建议,欢迎大家在留言提出,谢谢!1死亡细胞女王与海中文游戏类型动作过关发售日期2021。实况足球理性讨论,实时状态系统可以颠覆传奇为王吗?兄弟们,我发现我轻视了这个球员实时状态系统了。这两天打天梯,因为段位不是很高,很多对手的阵容都不是很好,但是踢起比赛来,我发现这些普卡精选阵容都强的一批反而是传奇时刻球员多的阵容还
友情链接:快好知快生活快百科快传网中准网文好找聚热点快软件