在Spring上DBCP和Hibernate,不会重新打开死连接,为什么?

时间:2011-04-12 13:44:06

标签: java mysql hibernate spring apache-commons-dbcp

我正在使用Hibernate和DBCP管理mySQL连接,所有这些都在Spring项目中完成。

一切都很好。唯一的问题是,如果应用程序保持静止很长时间,它将抛出异常,因为连接已死(如果我在应用程序启动时重新启动mySQLd也是如此)。这不是什么大问题,因为用户将获得异常页面(或自定义页面),重新加载将解决问题。但我想解决它。以下是例外的一部分:

com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception: 

**开始没有异常**

java.io.EOFException的 消息:无法读取服务器的响应。预计读取4个字节,在连接意外丢失之前读取0个字节。

堆栈跟踪:

java.io.EOFException:无法读取服务器的响应。预计读取4个字节,在连接意外丢失之前读取0个字节。

我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>

1 个答案:

答案 0 :(得分:11)

如果您设置testOnBorrow,则还必须设置validationQuery -

  

validationQuery - 将用于的SQL查询   验证此池中的连接   在将它们返回给调用者之前。   如果指定,则此查询必须是   返回的SQL SELECT语句   至少一排。

我还设置了timeBetweenEvictionRunsMillis,因此死锁连接将从池中逐出。