hibernate c3p0连接池断线自动重连

By | 2015年7月29日
Messages:
1. Software caused connection abort: recv failed
2. Communications link failure The last packet successfully received from the server was 2,174,468 milliseconds ago. The last packet sent successfully to the server was 7 milliseconds ago.
3. could not execute query
File: org/hibernate/exception/SQLStateConverter.java
Line number: 99

 

原因分析:

造成该异常的原因是因为连接池中的连接已经超时失效,而程序在使用该连接的时候没有去检测该连接是否有效。

解决方案:

1、修改mysql的超时等待时间:

2、修改c3p0的配置,使程序在使用连接池之前对连接进行检测,如果无效,则重新获取连接。

例子:

<!-- 数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="${jdbc.driverclass}" />
    <property name="jdbcUrl" value="${jdbc.url}" />
    <property name="user" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />

    <property name="maxPoolSize" value="${c3p0.pool.size.max}" />
    <property name="minPoolSize" value="${c3p0.pool.size.min}" />
    <property name="initialPoolSize" value="${c3p0.pool.size.ini}" />
    <property name="acquireIncrement" value="${c3p0.pool.size.increment}" />
    
    
    <!--定义在从数据库获取新连接失败后重复尝试的次数。默认值: 30 ;小于等于0表示无限次 -->
    <property name="acquireRetryAttempts" value="0" />
    <!--重新尝试的时间间隔,默认为:1000毫秒 -->
    <property name="acquireRetryDelay" value="1000" />
    <!--定义所有连接测试都执行的测试语句。在使用连接测试的情况下这个一显著提高测试速度。测试的表必须在初始数据源的时候就存在。Default: 
      null -->
    <property name="preferredTestQuery" value="select 1" />
    <!--每1800秒检查所有连接池中的空闲连接。Default: 0 -->
    <property name="idleConnectionTestPeriod" value="300" />
    <!-- 获取连接时测试有效性,每次都验证连接是否可用 -->
    <property name="testConnectionOnCheckout" value="false" />
   
</bean>