设置超时后关闭JDBC连接?

时间:2012-09-13 14:04:18

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

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

2 个答案:

答案 0 :(得分:1)

我同意Peter Lawrey的意见,我会确保始终关闭连接。但是,如果我仍然必须确保连接已关闭(如果有人从池中取出并忘记将其返回),我会按如下方式进行:

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

答案 1 :(得分:1)

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

removeAbandoned - (boolean)标记,用于删除已放弃的连接(如果它们超过removeAbandonedTimout)。如果设置为true,则连接被视为已放弃并且如果已使用的连接时间超过removeAbandonedTimeout,则可以进行删除。将此设置为true可以从未能关闭连接的应用程序恢复数据库连接。另请参见logAbandoned默认值为false。