我将Spring Framework 3.2与hibernate 4结合使用,在长时间的空闲时间后在本地服务器(apache-tomcat v7.0)上发送请求并且数据库位于远程服务器上时,出现上述异常。经过数小时的搜索,我发现问题出在连接池。我尝试了多个连接池,但没有找到令人满意的解决方案。贝娄是我的弹簧数据文件上的当前数据源
<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>
请指教。
当连接池中的连接不再主动连接到数据库时,将出现“无效或陈旧的连接”错误。以下是几种可能导致这种情况的情况
如果要设置InactivityTimeout,则必须确保它小于IDLE_TIME数据库强制执行的值。您可以通过IDLE_TIME以下查询获取
InactivityTimeout
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分钟运行一次并强制执行超时。因此,您始终希望将其设置为低于超时属性的值。
PropertyCheckInterval
我将始终确保使用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>
当您尝试验证从池中获得的旧连接时,网络实际上已断开时,您也可能会收到“无效或陈旧的连接错误”。