这几天一直遇到一个问题,有一个接口在长时间不访问后总是报 invalid connection
错误。
顾名思义,数据库连接是无效的 ,这是因为在长时间不使用后数据库单方面关闭了连接,导致gorm连接数据库的时候使用的连接已经变成无效连接了。
要想解决这个问题那么首先查看数据库的超时时间。
SHOW VARIABLES LIKE '%timeout%';
可以看到 wait_timeout = 28800
,也就是8小时,那么一个8小时内没有数据库操作的话,数据库就会关闭连接。
有很多给出修改数据库配置文件的方法,但在我看来不可行。数据库很多时候不能重启,而且也不一定有权限修改。
其实使用以下代码就可以解决了
db.DB().SetConnMaxLifetime(time.Hour*4) //括号里面是超时时间,要小于数据库的超时时间
设置之后,gorm的连接就会在设置的时长之后销毁,下次连接就会建立新的。
下面的参考有问题,不再引用
参考:https://www.cnblogs.com/already/p/12418816.html
针对上方参考的说明:
MySQL社区版不支持线程池,所以thread_pool_idle_timeout没用。在支持线程池的版本中,根据https://www.cnblogs.com/cchust/p/4510039.html ,线程池是MySQL服务端自己实现的,每个线程可能对应多个连接,所以线程的关闭和连接的关闭是不同的,不会相互影响(开启线程池的情况下)。最终还是要看wait_timeout,不放心可以自己试一下。