我使用 spring 框架 3.2 和 hibernate 4 ,在本地服务器( apache-tomcat v7.0 )上长时间空闲后发送请求时出现上述异常,并且数据库位于远程服务器上。经过几个小时的搜索,我发现问题出在连接池上。我尝试了连接池的数量,但没有找到令人满意的解决方案。下面是我的 spring-data 文件中的当前数据源
<bean id="dataSource" class="oracle.jdbc.pool.OracleDataSource"
destroy-method="close">
<property name="connectionCachingEnabled" value="true" />
<property name="URL" value="${app.jdbc.url}" />
<property name="user" value="${app.jdbc.username}" />
<property name="password" value="${app.jdbc.password}" />
<property name="connectionCacheProperties">
<value>
MinLimit:70
MaxLimit:200
InitialLimit:20
ConnectionWaitTimeout:120
InactivityTimeout:180
ValidateConnection:true
</value>
</property>
</bean>
请指教。
当连接池中有一个连接不再主动连接到数据库时,您将收到“无效或过时的连接”错误。以下是可能导致这种情况的几种情况
- dba 手动中止与数据库的连接。例如,如果
使用“ALTER SYSTEM KILL SESSION”终止连接
- 当连接池中存在一个连接而没有被使用时
时间很长并且由于超时而断开连接
数据库(空闲时间)
- 数据库重启
- 网络事件导致
连接断开,可能是因为网络变得
不可用或防火墙已断开已断开的连接
打开时间太长。
如果您正在设置InactivityTimeout
,那么你必须确保它小于IDLE_TIME
由数据库强制执行。您可以获得IDLE_TIME
使用以下查询
select * from dba_profiles dp, dba_users du
where dp.profile = du.profile and du.username ='YOUR_JDBC_USER_NAME';
当您使用connectionCacheProperties时,请务必确保您设置了PropertyCheckInterval
属性小于超时。默认值为 900 秒,这意味着缓存守护线程将仅每 15 分钟运行一次并强制超时。因此,您总是希望将其设置为低于超时属性的值。
我总是确保使用 0 作为 MinLimit。
稍微重写一下你的配置文件就可以了:
<bean id="dataSource" class="oracle.jdbc.pool.OracleDataSource" destroy-method="close">
<property name="connectionCachingEnabled" value="true" />
<property name="URL" value="${app.jdbc.url}" />
<property name="user" value="${app.jdbc.username}" />
<property name="password" value="${app.jdbc.password}" />
<property name="connectionCacheProperties">
<props merge="default">
<prop key="MinLimit">0</prop>
<prop key="MaxLimit">200</prop>
<prop key="InitialLimit">1</prop>
<prop key="ConnectionWaitTimeout">120</prop>
<prop key="InactivityTimeout">180</prop>
<prop key="ValidateConnection">true</prop>
<prop key="PropertyCheckInterval">150</prop>
</props>
</property>
</bean>
当您尝试验证从池中获取的旧连接时,如果您的网络实际上已损坏,您也可能会收到“无效或过时的连接错误”。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)