微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我正在使用Hibernate和DBCP管理MysqL连接,都在 Spring项目中.

一切都正常.唯一的问题是,如果应用程序保持很长时间,它将抛出一个异常,因为连接死了(同样的事情,如果我重新启动MysqLd,当应用程序启动时).这不是很大的事情,因为用户将获得异常页面(或定制的),并且重新加载将解决问题.但是我想解决它.这是例外的一部分:

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

**开始扣除**

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

堆栈跟踪:

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

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

解决方法

如果你设置testOnBorrow你还必须设置validationQuery –

validationQuery – The sql query that will be used to
validate connections from this pool
before returning them to the caller.
If specified,this query MUST be an
sql SELECT statement that returns at
least one row.

我也设置了timeBetweenevictionRunsMillis,所以死亡的连接将从池中逐出.

原文地址:https://www.jb51.cc/java/125314.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐