连接没有返回到tomcat池

时间:2013-05-28 15:13:07

标签: java jdbc tomcat7 connection-pooling

我在tomcat中有一个用于建立数据库连接的jdbc池。我没有在使用后显式关闭连接对象。我的'maxActive'参数设置为100.应用程序运行一段时间但是它失败了进行数据库查询。它等待无限时间查询数据库。

为什么'removeAbandoned'参数没有将未使用的连接对象返回给池?

Resource name="jdbc/Dhaval/Application"
        auth="Container" type="javax.sql.DataSource" driverClassName="oracle.jdbc.driver.OracleDriver" factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
        url="jdbc:oracle:thin:@XXXXXXX:orcl" username="XXXXXX" password="XXXXXX"
        maxActive="5" maxIdle="2" maxWait="-1"  logAbandoned="true" removeAbandoned="true" removeAbandonedTimeout="10" 

1 个答案:

答案 0 :(得分:2)

您始终需要在close()上明确调用Connection,即使它是由连接池分发的。对close()的调用是连接池的信号,Connection将返回到池中。

如果您没有呼叫close(),则连接池不知道连接是否再次可用且您的池已耗尽(有时该池具有回收连接的高级功能,但这些可能需要相当长的时间才能启动in和/或依赖于垃圾收集的发生。)

连接池分发的Connection是一个逻辑连接(通常是某种包装器或代理),而close()方法实际上并不关闭连接,而是执行一些清理工作关闭从逻辑连接创建的ResultSetStatement等,使逻辑连接无效,使其无法再使用,然后发信号通知连接池。

然后,连接池将根据其配置和内部逻辑决定是将连接放回池中,还是关闭物理连接(例如,因为池中已经有太多空闲连接)。