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