Java DBCP和Spring上的Hibernate没有重新打开死连接,为什么?

Java DBCP和Spring上的Hibernate没有重新打开死连接,为什么?,java,mysql,hibernate,spring,apache-commons-dbcp,Java,Mysql,Hibernate,Spring,Apache Commons Dbcp,我正在使用Hibernate和DBCP来管理mySQL连接,所有这些都在一个Spring项目中 一切正常。唯一的问题是,如果应用程序长时间保持静止,它将抛出一个异常,因为如果我在应用程序启动时重新启动mySQLd,连接将失效。这没什么大不了的,因为用户将获得异常页面或自定义页面,重新加载将解决问题。但我想解决它。以下是部分例外情况: com.mysql.jdbc.CommunicationsException: Communications link failure due to underly

我正在使用Hibernate和DBCP来管理mySQL连接,所有这些都在一个Spring项目中

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

com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception: 
**开始嵌套异常**

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

堆栈跟踪:

java.io.EOFEException:无法从服务器读取响应。预期读取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>
如果设置TestOnFroor,还必须设置validationQuery-

validationQuery—将用于 验证来自此池的连接 在把它们还给打电话的人之前。 如果指定,则此查询必须是 返回的SQL SELECT语句 至少一排


我还设置了timeBetweenEvictionRunsMillis,这样就可以从池中清除死连接。

这是否意味着每次Hibernate从DBCP借用一个连接时,都会运行此查询???这不是太重了吗?这应该是一个运行非常快的小查询。假设Hibernate为每个连接运行多个非微小查询,则多运行一个微小查询不会影响性能。。。。是的,我知道了,我使用了dbcp wiki上建议的SELECT 1。无论如何,我认为hibernate每次打开会话时都会获得连接。这意味着控制器几乎每次处理一个请求。我希望这只是一个与mySQL相关的问题。