带你理解golang mysql数据库连接池


当前第2页 返回上一页

而这个连接池主要是做什么的呢?简单的说就是,你要去数据库里面拿数据改数据,你就需要和数据库建立起一个管道,这个就是建立一个网络连接,我们都知道tcp连接是比较耗时的,那么既然已经花了一定时间去建立了这个管道,那么我怎么才能随取随用,而不用丢弃呢?那么连接池就是存放这些已经建立的管道的地方,50这个数值呢,可以简单的理解成最多放50个管道,注意,这个并不是越大越好,因为太大的话会比较占内存,当然了太小了会出现等待阻塞的情况。

既然连接池里面就是放这些管道的,那么空闲连接就是指这些空闲的管道,那么就很明显了,空闲连接的数值设置就不要大于连接池的大小了,因为大了连接池也不会帮你保存那么多的空闲连接管道的。

了解了这些简单的概念之后,那么每次访问数据库的时候是怎么一个工作流呢?

通过这个图我们就可以很清晰的看到整个连接访问的流程。

step1(获取可用的连接)去连接池里面寻找可用的空闲连接,如果没有空闲的连接了,那么就去判断是否连接池已满,如果没有超过,那么就去新建一个连接,如果满了,那么就等待连接的释放;当然了,如果有空闲连接的话,就直接判断这个连接是否过期,没有过期就直接用,过期了就重新去判断这个连接池是否已经满了,没有的话就去新建连接,满了就等待。

step2 (操作数据库)拿到了这个连接就去做增删改查操作。

step3 (释放连接)操作完数据库之后需要释放连接,那么释放的连接就会空闲下来,如果超过空闲连接数,就是直接关闭掉,如果没有就给等待的使用。

那么你就会注意到了,这个连接是会失效的:

mysql数据库的timeout,当你和数据库建立起连接的时候,数据库不能一直信任你啊,那么数据库就有了超时这一说,就是过了这个时间段我就不信任你这个连接了,你必须再次和我连接,查看数据库设置的各种超时时间的语句如下:

1

show variables like  '%timeout%';

其中这里面会有两个超时时间:交互式连接超时时间(interactive_timeout)和非交互式连接超时时间(wait_timeout)

交互式连接:就是你通过命令行与mysql连接

非交互式连接:就是在程序中与mysql连接

而这个非交互超时时间就是在连接池里面一直空闲的连接的空闲时间超过wait_timeout的设定的时候就会失效。那么这个时候当程序拿到这个空闲连接的时候去做查询的时候就会出现最开始出现的问题,invalid connection。

了解了基本原理之后,针对invalid connection无效连接的解决办法就很简单了:

1. 延长数据库的wait_timeout时间。

2. 程序定时去检查这些失效的连接及时丢弃掉,注意这里程序的检查时间就需要小于mysql设置的wait_timeout的值。

以上就是我对连接池的理解,如有错误还请大神指出,谢谢~

以上就是带你理解golang mysql数据库连接池的详细内容,更多文章请关注木庄网络博客!!

返回前面的内容

相关阅读 >>

Golang命令Go env

分布式事务最经典的七种解决方案

手撸Golang etcd raft协议之11

Golang mutex 源码解析

Go module来了,企业私有代理你准备好了吗?

聊聊cortex的readring

Golang协程详解和应用

Golang语言社区】四川麻将随机初始化牌型结构

Go是开源语言吗?

两个Golang超大文件读取的方案

更多相关阅读请进入《Go》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...