项目开发,Tomcat+Mysql,经常在早上刚到公司,第一次访问项目的时候会报以下异常:
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
这是因为Mysql5的连接等待时间(wait_timeout)默认8小时。
我们可以通过以下方法查看你的mysql 的默认连接等待时间是多少:
show global variables like 'wait_timeout';
结果如下:
此查询的时间单位是秒(s)
在wait_timeout时间内,mysql的连接(connection)处于等待状态,一旦超过这个时间,mysql5就会关闭。但是在我们的项目中的连接池中仍存在合法的connection,当你的程序需要再次访问数据库时,就会出现以上异常,但是再重新访问,又能正常从数据库中获取到数据。
这个时间是可以修改的,在windows中最大可设置为24天,需要修改mysql5的安装文件夹中的my.ini文件。
LInux中最大为365天,需要修改/etc/my.cnf文件。文件中添加一行配置:wait_timeout=1814400,(大约21天)重启mysql服务之后生效。
或者可以使用sql修改,但重启之后又会恢复成8小时,因此不推荐此方法:
mysql> set global wait_timeout=1814400;
mysql> show global variables like 'wait_timeout';
但是,即使你修改了时间,系统若长时间不用,一旦超过你设置的时间,再次访问依然会出现上述异常情况。因此,我又找了另一个可以永久解决该问题的办法。
我的解决方法:
方法一:减少连接池内连接的生存周期:
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="maxIdleTime"value="1800"/>
<!--other properties -->
</bean>
方法二:定期使用连接池中的连接,使其不失效
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="preferredTestQuery" value="SELECT 1"/>
<property name="idleConnectionTestPeriod" value="18000"/>
<property name="testConnectionOnCheckout" value="true"/>
</bean>
参考: