【发布时间】:2011-08-03 22:03:22
【问题描述】:
我在 Spring 项目中使用 Hibernate 和 DBCP 来管理 mySQL 连接。
一切正常。唯一的问题是,如果应用程序长时间保持静止,它会抛出异常,因为连接已死(如果我在应用程序启动时重新启动 mySQLd 也是如此)。这没什么大不了的,因为用户将获得异常页面(或自定义页面)并且重新加载将解决问题。但我想解决它。这是例外的一部分:
com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception:
** 开始嵌套异常 **
java.io.EOFException 消息:无法从服务器读取响应。预计读取 4 个字节,在连接意外丢失之前读取 0 个字节。
堆栈跟踪:
java.io.EOFException:无法从服务器读取响应。预计读取 4 个字节,在连接意外丢失之前读取 0 个字节。
我搜索了一下,发现使用 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>
【问题讨论】:
标签: java mysql hibernate spring apache-commons-dbcp