让你的DBCP连接池连接不超时

项目使用DBCP连接池,登录系统后,一段时间没有操作,再点击其他页面就报错,the last packet send to mysql was ** ago

度娘一下,知道是数据库连接超时,怎么解决呢?

首先想到的是MySQL数据库配置文件,mysql命令行执行,

show global variables like ‘wait_timeout’;

MySQL默认连接存活时长为28800秒,即8小时。如果在wait_timeout期间内,数据库连接(java.sql.Connection)一直处于等待状态,MySQL就将该连接关闭。此时,DBCP数据库连接池仍然合法地持有该连接,当用该连接来进行数据库操作时,就报上述错误。

解决方法一,设置一个较大的wait_timeout值。
wait_timeout的最大值分别是24天/365天(windows/linux,可通过修改my.ini或my.cnf,将wait_timeout配置一个较大值,这样可暂时解决这个问题。但如果连接等待超过配置时长,还是会有这个问题,这个办法不能根本上解决问题。

解决方法二,在应用的数据库连接配置上想办法,url增加autoReconnect\=true,可惜对mysql5以上版本无效,这个办法也不能根本解决问题。

解决办法三,在连接池配置文件上下功夫。
BasicDataSource有testOnBorrow、testOnReturn、testWhileIdle属性,意义分别是取得、返回对象和空闲时,是否进行对象有效性检查,默认都是False关闭状态。只要都设置为True,并提供validationQuery语句即可保证数据库连接始终有效。

testOnBorrow=true
testOnReturn=true
testWhileIdle=true
validationQuery=SELECT 1 FROM DUAL

问题解决,数据库连接超时错误再未出现。

你可能感兴趣的:(杂记)