遇到的问题

invalid connection

本质原因

go-sql-driver

go框架中的连接池初始化代码

其中

  • SetMaxIdleConns 为连接池保有的最大空闲连接数量,这里设置为10
  • SetMaxOpenConns 为连接池设置最大打开的连接数,这里设置为500
  • SetConnMaxLifetime 为连接最大的存活时间(如果在使用期间达到了最大的存活时间,则会等到使用结束之后再关闭)
wait_timeout

dev环境复现遇到的问题

查看 dev 环境 mysql 设置的 wait_timeout

go框架代码(上面示例代码)中设置为600秒,保留10个空闲连接,而 dev 环境 mysql 目前 wait_timeout 设置为500秒(线上的也是)。见下图:

复现过程

  1. 写一个 demo,将代码初始化数据库连接池的设置跟线上的一样(见上面示例代码);
  2. 然后 demo 开10个协程查询10次,让连接池缓存有10个连接;
  3. 等待大概501秒后(这里为了尽可能的复现问题,相关参数保持与线上的一致),再开启10个协程继续使用刚刚缓存的10个连接,然后查看结果。

测试代码

测试代码如下(关键代码):

现象及结果如下

执行以上测试代码,结果如下:

invalid connection

总结(解决方案)

wait_timeoutgo-sql-driverConnMaxLifetimewait_timeout

具体选择哪个方案来解决以上问题,需要根据业务的具体情况以及模块负责人的意见来权衡决定。

如果大家还有更好的解决方案的话,可以留言评论。