【问题标题】:Tomcat JDBC connection resources not releasedTomcat JDBC 连接资源未释放
【发布时间】:2015-10-04 03:13:14
【问题描述】:

我有一个使用 Tomcat JDBC 连接池的项目。

根据JDK规范,Connection.close()方法应该释放连接的资源,如StatementResultSet

我知道当使用来自池的连接时,close() 方法将被覆盖以释放连接回池。我想知道这个被覆盖的方法是否应该正确关闭相关资源。

Tomcat JDBC连接池没有释放资源,我需要在我的代码中显式关闭所有资源。

在调用Connection.close()时,是否有任何其他池实现可以正确关闭所有相关资源?

【问题讨论】:

  • 为什么你需要在你的代码中关闭它们?
  • 为什么要关闭连接并将它们从池中清除?拥有连接池的全部意义在于准备好已建立的连接,这些连接可以在需要时使用,而无需耗时的连接建立。它带有 Tomcat 是有原因的,不要试图杀死核心。
  • 你是对的,正确的连接池实现会在调用Connection.close()将连接返回连接池时关闭结果集、语句和其他资源。
  • @ChristopheSchutz 我看不到您的评论针对问题的哪一部分。关闭(池化)连接会将其返回到池中。并且根据规范一个连接关闭必须关闭相关资源(结果集、语句等),即使物理连接没有真正关闭,连接池发出的逻辑连接正在被关闭.
  • 您永远不应该依赖Connection 的这种行为,并且应该正确关闭(Auto)Closeable 中的所有(Auto)Closeable 资源try-with-finally。 Tomcat JDBC 很可能也使用了Statement 缓存,因此关闭Statement 也不会关闭它。连接池的行为比您理解的要复杂得多,我向您保证 Tomcat JDBC 池按预期运行。

标签: java tomcat jdbc pool


【解决方案1】:

您可以使用拦截器配置 tomcat-jdbc。 你感兴趣的是StatementFinalizer

http://tomcat.apache.org/tomcat-8.0-doc/jdbc-pool.html#org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer

【讨论】:

    猜你喜欢
    • 2013-05-01
    • 2012-01-08
    • 2014-05-07
    • 1970-01-01
    • 2015-12-26
    • 2015-03-26
    • 1970-01-01
    • 2015-06-21
    • 2016-07-01
    相关资源
    最近更新 更多