我在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"
答案 0 :(得分:2)
您始终需要在close()
上明确调用Connection
,即使它是由连接池分发的。对close()
的调用是连接池的信号,Connection
将返回到池中。
如果您没有呼叫close()
,则连接池不知道连接是否再次可用且您的池已耗尽(有时该池具有回收连接的高级功能,但这些可能需要相当长的时间才能启动in和/或依赖于垃圾收集的发生。)
连接池分发的Connection
是一个逻辑连接(通常是某种包装器或代理),而close()
方法实际上并不关闭连接,而是执行一些清理工作关闭从逻辑连接创建的ResultSet
,Statement
等,使逻辑连接无效,使其无法再使用,然后发信号通知连接池。
然后,连接池将根据其配置和内部逻辑决定是将连接放回池中,还是关闭物理连接(例如,因为池中已经有太多空闲连接)。