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

一切正常。唯一的问题是,如果应用程序长时间静止不动,它将因连接中断而引发异常(如果在应用程序启动时重新启动mySQLd,则情况也是如此)。没什么大不了的,因为用户将获得异常页面(或自定义页面),然后重新加载即可解决问题。但我想解决。这是异常(exception)情况的一部分:

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

**开始嵌套异常(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>

最佳答案

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



我还设置了timeBetweenEvictionRunsMillis,以便将死连接从池中驱逐出去。

09-04 07:56
查看更多