mysql could not execute query
场景:MySQL 8小时空闲 连接池错误 could not execute query
MySQL 8小时空闲 连接池异常 could not execute query
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.****.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> <!--可选-->