golang :连接数据库闲置断线的问题

golang :连接数据库闲置断线的问题,第1张

概述golang在进行数据库 *** 作,一般来说我们使用Open函数创建一个数据库( *** 作)句柄: func Open(driverName, dataSourceName string) (*DB, error) 我们知道,返回的*DB是一个具有零到多个底层连接的连接池,可以安全的被多个go程使用,并且会维护自身的闲置连接。所以一般来说open函数我们只调用一次,几乎很少需要关闭DB。 连接池可以使得连接更
 golang在进行数据库 *** 作,一般来说我们使用Open函数创建一个数据库( *** 作)句柄: func Open(drivername,dataSourcename string) (*DB,error) 我们知道,返回的*DB是一个具有零到多个底层连接的连接池,可以安全的被多个go程使用,并且会维护自身的闲置连接。所以一般来说open函数我们只调用一次,几乎很少需要关闭DB。 连接池可以使得连接更好的控制,于是简单配置甚至是不做什么配置就可以用了,事实好像也是如此,连上数据库就都ok了。但是!你很可能会遇到下面这样的错误: [MysqL] 2017/01/15 12:23:43 packets.go:124: write tcp 127.0.0.1:45697->127.0.0.1:3306:write: broken pipe 其原因很有可能就是你的连接池没有做好相关配置,或者配置了却设置的值不对,那么超时的原因大概有以下几点: 1.最大连接数大于数据库服务器端配置的最大连接数,多余的连接在被使用到的时候出现连接超时 2.网络抖动:每次连接的时候提交或维护大量数据,此时网络不稳定导致连接超时 3.占用的资源未被释放,我们一般只open一次,获取一个*DB,但是在使用stmt,rows或者是tx时候用完没有关闭,耗尽资源也有可能导致连接超时。 对于出现的3中问题,你可以试试下面的解决方案: 1.对于最大连接数的问题,调用函数Db.SetMaxOpenConns()设置值(小于数据库配置的最大连接) 2.对于维护大量数据,可以尝试采用事务 *** 作,若失败,回滚。然后重试。 3.使用defer关键字,在启用 *** 作的时候直接在下一行加上defer *.close()函数return的时候会执行相关的关闭函数。 如果你尝试了以上的解决方案,还是发现偶尔会出现连接超时的错误的话,很可能是因为数据库本身对连接有一个超时时间的设置,如果超时时间到了数据库会单方面断掉连接,此时再用连接池内的连接进行访问就会出错,连接池中的每个连接都维护了一个创建时间,取连接的时候会自动检查的,你可以试试调用db的SetConnMaxlifetime()方法来给db设置一个超时时间,时间小于数据库的超时时间即可。 以上仅是个人的一下看法,若有错误之处,欢迎批评指出。如果你尝试了以上的解决方案,还是发现偶尔会出现连接超时的错误的话,很可能是因为数据库本身对连接有一个超时时间的设置,如果超时时间到了数据库会单方面断掉连接,此时再用连接池内的连接进行访问就会出错,
总结

以上是内存溢出为你收集整理的golang :连接数据库闲置断线的问题全部内容,希望文章能够帮你解决golang :连接数据库闲置断线的问题所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1280371.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存