如果您不关闭 JDBC 连接,这是正确的行为。
当您使用完每个 JDBC 资源以及您使用它获得的其他 JDBC 资源时,您必须调用它的 close() 方法。
这适用于 Connection、Statement/PreparedStatement/CallableStatement、ResultSet 等。
如果您未能做到这一点,首先您将在 SQL 服务器上囤积大量且可能非常有限的资源。
最终,连接将不会被授予,获取查询以执行并返回结果将失败或挂起。
如果您未将 autoCommit 属性设置为 true,则您还可能会注意到您的 INSERT/UPDATE/DELETE 语句在每个事务结束时未能 commit() 或 rollback() 挂起。
我所看到的是,如果您将上面提到的严格应用到您的 JDBC 客户端代码中,那么 JDBC 和您的 SQL 服务器将非常顺利地工作。如果你写废话,那么一切都会像废话一样。
许多人编写 JDBC 调用时期望通过调用 close() 来释放每个东西,因为这很无聊,而且应用程序和服务器不会在他们忽略它时立即失败。
确实如此,但那些程序员编写了他们的程序来与他们的服务器玩“墙上的 99 瓶啤酒”。
资源将耗尽,请求往往会导致以下一种或多种情况发生:连接请求立即失败、SQL 语句立即失败或永远挂起或直到某个令人讨厌的冗长事务超时计时器到期,等等。
因此,解决这些类型的 SQL 问题的最快方法不是责怪 SQL 服务器、应用程序服务器、Web 容器、JDBC 驱动程序或 Java 垃圾收集器中嵌入的令人失望的人工智能。
解决这些问题的最快方法是射杀在您的应用程序中编写 JDBC 调用的人,该调用使用 Nerf dart 与您的 SQL 服务器通信。当他说:“你这样做是为了什么……?!”只需指向这篇文章并告诉他阅读即可。 (切记不要拍他的眼睛、手里的东西、可能危险/脆弱的东西等)
至于连接池解决您的问题...不。抱歉,连接池只是通过为应用程序提供一个预先分配的、可能是回收的连接来加速获取连接的调用。
牙仙子把钱放在你的枕头下,复活节兔子把鸡蛋和糖果放在你的灌木丛下,圣诞老人把礼物放在你的树下。但是,很抱歉打破了您的幻想 - SQL 服务器和 JDBC 驱动程序不会关闭所有内容,因为您“忘记”关闭您自己分配的所有内容。