0

我在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" 
4

1 回答 1

2

你总是需要显式调用close()a Connection,即使它是由连接池分发的。对连接池的调用close()是一个信号,表明连接池Connection将返回连接池。

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

连接池分发的Connection是一个逻辑连接(通常是某种包装器或代理),该close()方法实际上并不关闭连接,而是执行一些清理,如从逻辑连接创建的关闭ResultSetStatement,使逻辑连接无效所以它不能再被使用,然后向连接池发出信号。

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

于 2013-05-28T15:38:03.003 回答