我正在使用Hibernate和DBCP管理MysqL连接,都在
Spring项目中.
@H_502_2@一切都正常.唯一的问题是,如果应用程序保持很长时间,它将抛出一个异常,因为连接死了(同样的事情,如果我重新启动MysqLd,当应用程序启动时).这不是很大的事情,因为用户将获得异常页面(或定制的),并且重新加载将解决问题.但是我想解决它.这是例外的一部分:
MESSAGE:无法从服务器读取响应.预期读取4个字节,读取0字节,连接意外丢失. @H_502_2@堆栈跟踪: @H_502_2@java.io.EOFException:无法从服务器读取响应.预期读取4个字节,连接意外丢失. @H_502_2@我google了,我发现用MysqL我应该将dbcp.BasicDataSource属性testOnBorrow设置为true,这是我在servlet-context.xml中完成的:
com.MysqL.jdbc.CommunicationsException: Communications link failure due to underlying exception:@H_502_2@**开始扣除** @H_502_2@java.io.EOFException的
MESSAGE:无法从服务器读取响应.预期读取4个字节,读取0字节,连接意外丢失. @H_502_2@堆栈跟踪: @H_502_2@java.io.EOFException:无法从服务器读取响应.预期读取4个字节,连接意外丢失. @H_502_2@我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>@H_502_2@但问题仍然存在.任何线索? @H_502_2@解!我用了:
<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 –
@H_502_2@validationQuery – The sql query that will be used to@H_502_2@我也设置了timeBetweenEvictionRunsMillis,所以死亡的连接将从池中逐出.
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.