日期:2014-05-16  浏览次数:20622 次

MySQL 8小时空闲 连接池异常 could not execute query

使用SSH2+TOMCAT6+MYSQL开发,假如超过8小时未访问数据库,将hibernate出现如下异常
org.hibernate.exception.JDBCConnectionException: could not execute query at?
org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java: 74 )

这是因为Mysql服务器默认的“wait_timeout”是28800秒,而hibernate自带的默认连接池DriverManagerConnectionProvider没有解决这个问题
可通过C3P0、Proxool、DBCP等数据库连接池解决该问题

最后我采用了C3P0,貌似配置比较容易,Spring配置C3P0

<!-- DataSource Definition, using c3p0 connection pool -->  
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">  
    <property name="driverClass" value="${jdbc.driverClassName}" />  
    <property name="jdbcUrl" value="${jdbc.url}" />  
    <property name="user" value="${jdbc.username}" />  
    <property name="password" value="${jdbc.password}" />  
    <property name="minPoolSize" value="5" />  <!--连接池中保留的最小连接数。-->
    <property name="maxPoolSize" value="20" />  <!--连接池中保留的最大连接数。Default: 15 -->
    <property name="maxIdleTime" value="60" />  <!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
    <property name="acquireIncrement" value="5" />  <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->
    <property name="maxStatements" value="0" />  
    <property name="initialPoolSize" value="10" />  <!--初始化时获取的连接数,取值应在minPoolSize与maxPoolSize之间。Default: 3 -->
     <property name="automaticTestTable" value="c3p0Test" />   <!--c3p0自动建立表c3p0Test测试连接的有效性-->
    <property name="idleConnectionTestPeriod" value="60" />  <!--每60秒检查所有连接池中的空闲连接。Default: 0 -->
    <property name="acquireRetryAttempts" value="30" />  <!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 -->
    <property name="testConnectionOnCheckout" value="false" />  <!--因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的时候都将校验其有效性。建议使用idleConnectionTestPeriod或automaticTestTable等方法来提升连接测试的性能。Default: false-->   
</bean>
?
可参考更多网上资料,例如

http://csumissu.iteye.com/blog/1089918
http://blog.csdn.net/cutesource/article/details/5422093

?

补充:

或者可以不改连接池,先试试在hibernate中加上配置自动重连接配置 试试,我没试过。。。。

<property name="connection.autoReconnect">true</property> 
<property name="connection.autoReconnectForPools">true</property> <!--可选-->
<property name="connection.is-connection-validation-required">true</property> <!--可选-->
?

?

?

?