在最近项目开发中遇到一个问题,情况是这样的,第一天数据库操作完全正常的,第二天早上来,就报错invalid connection。
明明第一天都是正常的,第二天来就报错了,这个问题比较尴尬。于是上网搜索后,了解到,原来mysql 连接有超时机制。如下:
interactive_timeout=28800
wait_timeout=28800
默认情况下是28800(8小时)
简单解释一下,就是8小时内,相关连接没有任何操作,那么mysql就会自动关闭这个连接。那么就是解释了,我们项目为什么第一天无任何异常,第二天就报错了(晚上,大家都下班回家睡觉了)。这个连接空闲了超过8小时,就被mysql关闭了,但是beego(我们项目采用的beego框架)连接池并不知晓,然后继续使用这个连接,结果就报错啦。
那么这么解决这个问题呢?
有两种方案:
(1) 修改数据库配置文件,把超时时间配置更长一点。
interactive_timeout= 86,400
wait_timeout= 86,400
这样是24小时超时 ,一般情况下够用了。但是这种方案缺点也很明显,比如重新配置一个服务器也要如此修改配置—比较麻烦。还有就是如果真的超过24小时(比如周末),任然会报错。所以这个方案不太理想
(2) 修改beego mysql连接池设置。把连接超时时间设置短一些,超时后会断开该连接。连接池会自动新建另外一个连接。这样就避免了mysql超时,报错的情况了。这种方式,比较灵活方便,这里也推荐使用这种方式。具体api也贴一下吧:
a. 如果项目中, 直接使用sql.DB,那么直接调用
db.SetConnMaxLifetime(time.Second * 500) //设置连接超时500秒
b. 如果项目中,使用了orm,这种情况稍微复杂一点,因为orm对sql.DB 进行了封装.需要采取先从获取sql.DB,然后在设置超时的方式
sqlDB,err := orm.GetDB("default")
if nil != err{
return nil
}
sqlDB.SetConnMaxLifetime(time.Second * 500)
其中, "default"是数据库别名。
好了,这就是工作中遇到的问题,在这里记录一下吧
作者: hejingdong123
链接: https://blog.csdn.net/hejingdong123/article/details/100653901
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
到此这篇关于“Golang/beego orm连接mysql 数据库”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持Go语言编程网!
相关文章: