【问题标题】:Close JDBC connections after a set timeout period?在设置的超时期限后关闭 JDBC 连接?
【发布时间】:2012-09-06 15:34:57
【问题描述】:

有没有办法在设定的超时时间后关闭 JDBC 连接?这些连接是在 GenericObjectPool 中创建的。我知道池可以关闭池中的空闲连接,但是那些被认为是活动的连接呢?如果有人不调用 close(),我正在尝试控制连接泄漏。从我所读到的唯一方法可能是在服务器上设置超时时间,但我希望在 Java 中找到一种方法。谢谢!

【问题讨论】:

  • 我会确保您正确关闭资源。尝试解决问题可能会隐藏更严重的问题。
  • 您能否详细说明一下:“如果有人不调用 close()。”
  • 我认为他的意思是程序员忘记在连接上调用close()

标签: java jdbc connection connection-pooling connection-timeout


【解决方案1】:

我同意 Peter Lawrey 的观点,即我会确保始终关闭连接。但是如果我仍然必须确保连接已关闭(如果有人从池中取出并忘记返回它),我会这样做:

  1. 装饰池返回的 java.sql.Connection。
  2. 在构造函数中创建一个计时器并将其设置为配置的持续时间,以容忍活动连接。
  3. 如果用户在计时器触发之前对其调用 close,我将取消计时器并将连接返回到池。
  4. 如果计时器在用户关闭连接之前触发,我会将连接返回到池中并使修饰的连接无效,以便进一步调用将抛出 IllegalStateException

【讨论】:

  • 顺便提一下Glassfish中有Leak TimeoutLeak Reclaim连接池高级设置。如果在Leak Timeout 秒后没有返回连接池,则自动返回连接池(如果启用了Leak Reclaim)。
  • 是的,activeConnectionTimeout 已成为连接池中的一个可配置参数。感谢您提供有关 glassfish 的信息
  • 感谢您的想法。我会调查一下。你们是对的,调用 close 是最好的解决方案。
【解决方案2】:

我使用的是旧的 Apache 公共池,但我切换到了新的 Apache Tomcat Pool 这实际上具有在超时后删除连接的功能。

removeAbandoned - (boolean) 标志以在超过 removeAbandonedTimout 时删除放弃的连接。如果设置为 true,则如果连接的使用时间超过 removeAbandonedTimeout,则该连接被视为已放弃并有资格删除。将此设置为 true 可以从无法关闭连接的应用程序中恢复数据库连接。另见 logAbandoned 默认值为 false。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-20
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    • 2021-04-07
    • 1970-01-01
    • 2022-01-20
    • 2012-09-24
    相关资源
    最近更新 更多