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>