【问题标题】:Connection not returned to tomcat pool连接未返回到 tomcat 池
【发布时间】:2013-05-23 15:09:34
【问题描述】:

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

【问题讨论】:

标签: java jdbc tomcat7 connection-pooling


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2016-02-03
    • 2015-03-28
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 2011-11-07
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多