问题背景
Java后台日志发现Error updating database. Cause: com.mysql.jdbc.municationsException: Communications link failure的错误,查了下,发现是mysql连接超时断开,而连接池还以为链接正常时报的错误;
解决方案
1、延长空闲超时时间
set global wait_timeout=604800;
set global interactive_timeout=604800;
这两个参数分别都设置为604800秒即7天;
2、添加连接池对数据库连接的状态检测动作(有降低一定性能)
<bean id=”dataSource” class=”com.mchange.boPooledDataSource” destroy-method=”close”>
<property name=”driverClass” value=”${dataSourceforSe.driverClassName}” />
<property name=”jdbcUrl” value=”${dataSourceforSe.url}”/>
<property name=”user” value=”${dataSourceforSe.username}”/>
<property name=”password” value=”${dataSourceforSe.password}”/>
<property name=”minPoolSize” value=”2″/>
<property name=”maxPoolSize” value=”20″/>
<property name=”maxIdleTime” value=”1800″/>
<property name=”acquireIncrement” value=”2″/>
<property name=”maxStatements” value=”0″/>
<property name=”initialPoolSize” value=”3″/>
<property name=”idleConnectionTestPeriod” value=”240″/>
<property name=”acquireRetryAttempts” value=”10″/>
<property name=”breakAfterAcquireFailure” value=”false”/> <!– 网络故障恢复之后,pool能继续请求设为false –>
<property name=”testConnectionOnCheckout” value=”true”/>
</bean>
在原有配置上添加三个选项
<property name="breakAfterAcquireFailure" value="false"/><property name="idleConnectionTestPeriod" value="180"/><property name="acquireRetryAttempts" value="10"/>breakAfterAcquireFailure: falsetrue表示pool向数据库请求连接失败后标记整个pool为block并close,就算后端数据库恢复正常也不进行重连,客户端对pool的请求都拒绝掉。false表示不会标记pool为block,新的请求都会尝试去数据库请求connection。默认为false。因此,如果想让数据库和网络故障恢复之后,pool能继续请求正常资源必须把此项配置设为falseidleConnectionTestPeriod: 60C3P0会有一个Task检测pool内的连接是否正常,此参数就是Task运行的频率。默认值为0,表示不进行检测。acquireRetryAttempts: 10重试次数
查看原文