项目使用DBCP的BasicDataSource连接池,登录后没有操作一段时间,再点击其他页面就会报错,
从日志看到报the last packet send to mysql was ** ago。
度娘一下,知道是数据库连接超时。
首先想到的是MySQL数据库配置文件,命令行执行:
show global variables like ‘wait_timeout’;
MySQL默认连接存活时长为28800秒,即8小时。
如果在wait_timeout秒期间内,数据库连接(java.sql.Connection)一直处于等待状态,MySQL5就将该连接关闭。
这时,你的Java应用的连接池仍然合法地持有该连接的引用,当用该连接来进行数据库操作时,就碰到上述错误。
wait_timeout的最大值分别是24天/365天(windows/linux),
可通过修改my.ini或my.cnf,增加wait_timeout,配置一个较大值,这样可暂时解决这个问题;
但如果连接等待超过配置的时长,还是会有这个问题,这个办法不能从根本上解决这一问题。
在Java应用连接上想办法,url增加autoReconnect\=true,对mysql5以上的版本无效。
最后,只能在连接池的入口——配置文件上下功夫解决这一问题。
BasicDataSource有testOnBorrow、testOnReturn、testWhileIdle属性,
意义分别是取得、返回对象和空闲时,是否进行验证检查对象是否有效。
默认都是False关闭状态。只要把它们设置为True,并提供validationQuery语句即可保证数据库连接始终有效。