Golang/beego orm连接mysql 数据库

在最近项目开发中遇到一个问题,情况是这样的,第一天数据库操作完全正常的,第二天早上来,就报错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"是数据库别名。
好了,这就是工作中遇到的问题,在这里记录一下吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值