我正在使用Hibernate和DBCP管理MysqL连接,都在
Spring项目中.
一切都正常.唯一的问题是,如果应用程序保持很长时间,它将抛出一个异常,因为连接死了(同样的事情,如果我重新启动MysqLd,当应用程序启动时).这不是很大的事情,因为用户将获得异常页面(或定制的),并且重新加载将解决问题.但是我想解决它.这是例外的一部分:
com.MysqL.jdbc.CommunicationsException: Communications link failure due to underlying exception:
**开始扣除**
java.io.EOFException的
MESSAGE:无法从服务器读取响应.预期读取4个字节,读取0字节,连接意外丢失.
堆栈跟踪:
java.io.EOFException:无法从服务器读取响应.预期读取4个字节,连接意外丢失.
我google了,我发现用MysqL我应该将dbcp.BasicDataSource属性testOnBorrow设置为true,这是我在servlet-context.xml中完成的:
<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.MysqL.jdbc.Driver" /> <property name="url" value="jdbc:MysqL://${MysqL.host}/${MysqL.db}" /> <property name="username" value="${MysqL.user}" /> <property name="password" value="${MysqL.pass}" /> <property name="testOnBorrow" value="true"></property> </bean>
但问题仍然存在.任何线索?
解!我用了:
<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.MysqL.jdbc.Driver" /> <property name="url" value="jdbc:MysqL://${MysqL.host}/${MysqL.db}" /> <property name="username" value="${MysqL.user}" /> <property name="password" value="${MysqL.pass}" /> <property name="testOnBorrow" value="true"></property> <property name="validationQuery" value="SELECT 1"></property> </bean>
解决方法
如果你设置testOnBorrow你还必须设置validationQuery –
validationQuery – The sql query that will be used to
validate connections from this pool
before returning them to the caller.
If specified,this query MUST be an
sql SELECT statement that returns at
least one row.
我也设置了timeBetweenEvictionRunsMillis,所以死亡的连接将从池中逐出.