项目使用了c3p0 pool, mybatis spring mvc
本地无问题,部署到服务器后发现偶尔会发生: Communications link failure due to underlying exception , 刷新下又好了。
查看了下参数和资料,发现是mysql设置和连接池设置冲突的问题:
默认情况为了提高性能,我们会在c3po参数配置最大空闲时间:
<property name="driverClass" value="${db.driverClass}" />
<property name="jdbcUrl" value="${db.jdbcUrl}" />
<property name="user" value="${db.user}" />
<property name="password" value="${db.password}" />
<property name="initialPoolSize" value="3"></property>
<property name="maxIdleTime" value="7200"></property> //这个参数
<property name="maxPoolSize" value="40"></property>
<property name="minPoolSize" value="3"></property>
<property name="acquireRetryDelay" value="1000"></property>
<property name="acquireRetryAttempts" value="3"></property>
<property name="breakAfterAcquireFailure" value="false"></property>
这个参数可以大大提高空闲连接对象的重用度以提升系统性能,但是也带来一个问题,7200即2个小时,如果这个connect对象被mysql服务器关闭了的话,那它就是个废的,这时候便c3p0会去重连一个,所以如果你刷新页面,应用程序又恢复正常了。
也就是说mysql服务器在一个wait_timeout时间后如果这个连接不使用会被强制关闭,因此光配置maxIdleTime是不行的,必须修改mysql服务器端my.ini配置文件中的一些参数,使得连接最大时间》你的maxIdleTime 才不会出现这个问题。
通过这个命令可以查询当前mysql参数:
mysql>show variables like '%timeout';
打印结果如下:
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| connect_timeout | 5 |
| delayed_insert_timeout | 300 |
| interactive_timeout | 28800 | //
| net_read_timeout | 30 |
| net_write_timeout | 60 |
| slave_net_timeout | 3600 |
| wait_timeout | 28800 | //
+----------------------------+-------+
[root@sample ~]#/etc/rc.d/init.d/mysqld stop
[root@sample ~]#/etc/rc.d/init.d/mysqld start