今天发现在写的一个项目打开时时不时会报错,错误信息大致如下:
The last packet successfully received from the server was 9,291,267 milliseconds ago. The last packet sent successfully to the server was 9,291,324 milliseconds ago.
但是每次重启Tomcat后问题又会消失,因此觉得是连接超时导致的断开。
经查询资料得知,mysql中有一个连接超时时间的概念,查询得数据库的连接超时时间为28800秒,即为8小时。
查询方法:
在MySQL得控制台下输入:
SHOW VARIABLES;
在获取到的数据得最后一行即为连接超时时间,
wait_timeout 28800
如果单位是秒,也就是 8 个小时。
程序最后一次建立连接完毕之后 8 个小时,
Mysql 单方面关闭了这个连接。
查了很多资料,解决方法大致分为两种:
1、将数据库的连接超时时间设置大一点
打开mysql控制台,输入两行
代码如下:
msyql> set global wait_timeout=1814400;
msyql> set global interactive_timeout=1814400;
将数据库的连接超时时间改大,但是这样做治标不治本。
2、在spring配置文件中增加一个bean,设置c3p0每隔多长时间自动检测与数据库的连接,并在断开后重连
bean的代码如下:
<bean id="pooledDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
<property name="driverClass" value="${jdbc.driverClass}"></property>
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
<!--下面两个属性就是设置c3p0隔28800秒自动检测与数据库的连接(28800也是mysql的默认的连接超时时间)--!>
<property name="testConnectionOnCheckin" value="true"></property>
<property name="idleConnectionTestPeriod" value="28800"></property>
</bean>