got*_*ch4 10 java mysql spring hibernate apache-commons-dbcp
我在Spring项目中使用Hibernate和DBCP来管理mySQL连接.
一切都很好.唯一的问题是,如果应用程序保持静止很长时间,它将抛出异常,因为连接已死(如果我在应用程序启动时重新启动mySQLd也是如此).这不是什么大问题,因为用户将获得异常页面(或自定义页面),重新加载将解决问题.但我想解决它.以下是例外的一部分:
com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception:
Run Code Online (Sandbox Code Playgroud)
**开始没有异常**
java.io.EOFException MESSAGE:无法读取服务器的响应.预计读取4个字节,在连接意外丢失之前读取0个字节.
堆栈跟踪:
java.io.EOFException:无法读取服务器的响应.预计读取4个字节,在连接意外丢失之前读取0个字节.
我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>
Run Code Online (Sandbox Code Playgroud)
但问题仍然存在.有线索吗?
解!我用了:
<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>
Run Code Online (Sandbox Code Playgroud)
Tar*_*log 11
如果你设置testOnBorrow你还必须设置validationQuery-
validationQuery - 在将它们返回给调用者之前用于验证来自此池的连接的SQL查询.如果指定,则此查询必须是返回至少一行的SQL SELECT语句.
我还设置timeBetweenEvictionRunsMillis了死锁连接将从池中逐出.
| 归档时间: |
|
| 查看次数: |
4917 次 |
| 最近记录: |