Tomcat连接池不释放空闲连接

时间:2014-05-27 23:13:19

标签: tomcat7 connection-pooling

我在tomcat 7.0.42上使用tomcat DBCP和Oracle数据库。以下是我的资源定义示例:

<Resource name="jdbc/DB_alias1"
   auth="Container"
   type="javax.sql.DataSource"
   fairQueue="true"
   username="user"
   password="password"
   driverClassName="oracle.jdbc.OracleDriver"
   url="jdbc:oracle:thin:@(...)"
   timeBetweenEvictionRunsMillis="180000"
   minEvictableIdleTimeMillis="120000"
   maxActive="50"
   maxIdle="4"
   minIdle="4"
   maxWait="10000"
   initialSize="4"
   initSQL="<A valid init SQL>"
   validationQuery="SELECT 1 from dual"
   validationInterval="60000"
   testOnBorrow="false"
   testOnReturn="false"
   testWhileIdle="true"
   removeAbandonedTimeout="120"
   removeAbandoned="true"
   logAbandoned="false"
/>

启动时会创建4个初始连接。根据上述配置,在minEvictableIdleTimeMillis之后,所有空闲连接都应该有资格被回收/销毁。

由于我有4个空闲连接,因此我希望每timeBetweenEvictionRunsMillis秒回收/销毁这4个连接,并使用新的登录时间创建4个新连接。在检查数据库中的连接时,我看到登录时间与创建初始连接时保持一致,即使在一两天之后也永远不会更新。如果DB中的数据发生任何变化,这些陈旧的连接会提供不正确的结果。

Apache commons DBCP不是这种情况,其中连接是根据timeBetweenEvictionRunsMillis自动回收的。

我尝试在此论坛上搜索有关解决方案的提示,但到目前为止还没有任何工作。我想知道我是否可能没有正确完成配置。任何见解将不胜感激。

谢谢!

1 个答案:

答案 0 :(得分:1)

  

由于我有4个minIdle连接,所以我希望这4个连接每次都可以循环/销毁,只能在EvictionRunsMillis秒之间

没有。恰恰相反。 minIdle = 4表示允许四个连接保留在池中,即使它们处于空闲状态(事实上,如果需要,池甚至会增长以保持四个空闲连接)。

  

如果数据库中的数据发生任何变化,这些陈旧的连接会提供不正确的结果。

无论何时创建连接,都不应该发生这种情况。

即使连接是在几天前创建的,连接也会发出新的查询。除非你有一些非常奇怪的缓存。

空闲连接可能发生的情况是它们超时并断开连接。但是这应该由validationQuery来处理。