golang mysql连接池原理_Golang你一定要懂的连接池实现

问题引入

作为一名golang开发者,线上环境遇到过好几次连接数暴增问题(mysql/redis/kafka等)。

纠其原因,golang作为常驻进程,请求第三方服务或者资源完毕后,需要手动关闭连接,否则连接会一直存在。而很多时候,开发者不一定记得关闭这个连接。

这样是不是很麻烦?于是有了连接池。顾名思义,连接池就是管理连接的;我们从连接池获取连接,请求完毕后再将连接还给连接池;连接池帮我们做了连接的建立、复用以及回收工作。

在设计与实现连接池时,我们通常需要考虑以下几个问题:

连接池的连接数目是否有限制,最大可以建立多少个连接?

当连接长时间没有使用,需要回收该连接吗?

业务请求需要获取连接时,此时若连接池无空闲连接且无法新建连接,业务需要排队等待吗?

排队的话又存在另外的问题,队列长度有无限制,排队时间呢?

golang连接池实现原理

我们以golang http连接池为例,分析连接池的实现原理。

结构体transport

transport结构定义如下:

type transport struct {

//操作空闲连接需要获取锁

idlemu sync.mutex

//空闲连接池,key为协议目标地址等组合

idleconn map[connectmethodkey][]*persistconn // most recently used at end

//等待空闲连接的队列,基于切片实现,队列大小无限制

idleconnwait map[connectmethodkey]wantconnqueue // waiting getconns

//排队等待建立连接需要获取锁

connsperhostmu sync.mutex

//每个host建立的连接数

connsperhost map[connectmethodkey]int

//等待建立连接的队列,同样基于切片实现,队列大小无限制

connsperhostwait map[connectmethodkey]wantconnqueue // waiting getconns

//最大空闲连接数

maxidleconns int

//每个目标host最大空闲连接数;默认为2(注意默认值)

maxidleconnsperhost

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值