java - 连接未返回 tomcat 池

标签 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" 

最佳答案

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

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

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

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

关于java - 连接未返回 tomcat 池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16795562/

相关文章:

database - 是否有用于 DB2 的 JDBC 4.1 驱动程序?

google-chrome - 具有大 json 响应的 HTTPS 请求无法下载 [Tomcat]

jsf - 使用 JAAS 登录后出现 RES_NOT_FOUND

Java 针对 org.w3c.dom.Node 评估 XPath

jdbc - 无法基于 Microsoft Azure SQL 数据库表在 Microsoft Azure Databricks 中创建表

java - 如何使用java删除mongodb中的多个文档

java - 尝试使用 PreparedStatement 查询数据库,ResultSet 在不应该关闭的时候返回关闭

java - Tomcat 7 无法部署 war - 无法解析配置类

java - 如何修复android java中的sqliteException

java - 当我的应用程序设置为默认值时,手机本身的短信应用程序被禁用