遇到的问题
invalid connection本质原因
go-sql-drivergo框架中的连接池初始化代码
其中:
- SetMaxIdleConns 为连接池保有的最大空闲连接数量,这里设置为10
- SetMaxOpenConns 为连接池设置最大打开的连接数,这里设置为500
- SetConnMaxLifetime 为连接最大的存活时间(如果在使用期间达到了最大的存活时间,则会等到使用结束之后再关闭)
wait_timeoutdev环境复现遇到的问题
查看 dev 环境 mysql 设置的 wait_timeout
go框架代码(上面示例代码)中设置为600秒,保留10个空闲连接,而 dev 环境 mysql 目前 wait_timeout 设置为500秒(线上的也是)。见下图:
复现过程
- 写一个 demo,将代码初始化数据库连接池的设置跟线上的一样(见上面示例代码);
- 然后 demo 开10个协程查询10次,让连接池缓存有10个连接;
- 等待大概501秒后(这里为了尽可能的复现问题,相关参数保持与线上的一致),再开启10个协程继续使用刚刚缓存的10个连接,然后查看结果。
测试代码
测试代码如下(关键代码):
现象及结果如下
执行以上测试代码,结果如下:
invalid connection总结(解决方案)
wait_timeoutgo-sql-driverConnMaxLifetimewait_timeout具体选择哪个方案来解决以上问题,需要根据业务的具体情况以及模块负责人的意见来权衡决定。
如果大家还有更好的解决方案的话,可以留言评论。