11

我在 Spring 项目中使用 Hibernate 和 DBCP 来管理 mySQL 连接。

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

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

** 开始嵌套异常 **

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

堆栈跟踪:

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

我四处搜索,发现使用 mysql 我应该将dbcp.BasicDataSource属性设置testOnBorrowtrue,我已经在我的 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>
4

1 回答 1

12

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

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

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

于 2011-04-12T17:32:09.630 回答