温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

golang中mysql数据库连接池的示例分析

发布时间:2021-05-11 13:52:57 来源:亿速云 阅读:547 作者:小新 栏目:编程语言

这篇文章主要介绍golang中mysql数据库连接池的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

golang的优点

golang是一种编译语言,可以将代码编译为机器代码,编译后的二进制文件可以直接部署到目标机器而无需额外的依赖,所以golang的性能优于其他的解释性语言,且可以在golang中使用goroutine来实现并发性,它提供了一个非常优雅的goroutine调度程序系统,可以很容易地生成数百万个goroutine。

最近在使用go语言的orm做一些数据库的操作,最后发现了一个bug就是invalid connection,所以就去的了解了一下链接池和mysql的超时时间,下面我就用go的orm+mysql来说明(我理解语言都是相通的,原理应该都是一样的)。

在我们要对数据库进行增删改查的时候,第一步就是要去连接数据库

//conn the database
func ConnDb(dbConnString string, dbName string) error {
	maxIdle := 50
	maxConn := 50
	err := orm.RegisterDataBase(dbName, "mysql", dbConnString+"?charset=utf8&loc=Asia%2FShanghai", maxIdle, maxConn)

	if err != nil {
		util.GLogger.Errorw("in Connect DB", "err", err)
	}
	return err
}

这里面连接的就是mysql数据库,设置的最大连接池为50,最大空闲连接是50。

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

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

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

golang中mysql数据库连接池的示例分析

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

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

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

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

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

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

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数据库连接池的示例分析”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI