记Go "database/sql" 连接池遇到的一个问题

在Go项目中,使用database/sql包遇到线上环境出现bad connection错误,特别是在低频调用的服务中。问题源于连接池未设置连接最大存活时间。通过设置SetConnMaxLifetime避免客户端持有已失效的数据库连接,从而解决异常。当无效连接被耗尽,连接池会创建新连接,恢复正常服务。
摘要由CSDN通过智能技术生成

"database/sql" 连接池遇到的一个坑

背景

笔者参与的项目使用到golang语言作为开发语言,在持久层方面,考虑到golang自带的database/sql包已经实现了连接池,因此没有使用开源的orm框架,直接使用sql包做了简单的封装供项目持久层使用。

原生API使用

定义了一个读写DBhandle结构体
初始化函数中调用open函数获得一个写连接池,一个读连接池
最后封装了CRUD方法提供调用

线上环境遇到的问题

线上偶然看到日志存在bad connection的报错,特别是一些管理端的服务(调用不频繁,超过1天未操作过该服务接口),多次调用异常后,请求又可以恢复正常。

解决方法

上述问题,笔者感觉是数据库连接池失效的原因,项目中翻出上图代码,果然发现获得连接池对象时,并没有设置连接最大存活时间,即调用方法SetConnMaxLifetime。
由于服务端(此时是mysql数据库默认连接超时关闭时间是28800秒),客户端连接池中持有的连接

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值