0

0

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

藏色散人

藏色散人

发布时间:2021-05-11 11:32:54

|

3239人浏览过

|

来源于csdn

转载

下面由golang教程栏目给大家介绍golang mysql数据库连接池,希望对需要的朋友有所帮助!

最近在使用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个管道,注意,这个并不是越大越好,因为太大的话会比较占内存,当然了太小了会出现等待阻塞的情况。

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

立即学习go语言免费学习笔记(深入)”;

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

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

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

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

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

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

LANUX蓝脑商务网站系统
LANUX蓝脑商务网站系统

LANUX V1.0 蓝脑商务网站系统 适用于网店、公司宣传自己的品牌和产品。 系统在代码、页面方面设计简约,浏览和后台管理操作效率高。 此版本带可见即可得的html编辑器, 方便直观添加和编辑要发布的内容。 安装: 1.解压后,更换logo、分类名称、幻灯片的图片及名称和链接、联系我们等等页面。 2.将dbconfig.php里面的数据库配置更改为你的mysql数据库配置 3.将整个文件夹上传至

下载

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如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

178

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

226

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

337

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

208

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

388

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

195

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

190

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

192

2025.06.17

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

36

2026.01.14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 3.7万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号