是否有理由永远不关闭JDBC连接?

我正在读取上一个开发人员的代码,他从不关闭与数据库的任何连接。 他只关闭PreparedStatementResultSet连接,但从不关闭Connection。

系统不使用连接池。

是否有任何理由不关闭所有内容( ConnectionPreparedStatementResultSet )?

这没有充分的理由,它将导致非常脆弱的应用程序。 如果存在网络问题或者数据库没有响应一段时间,数据库连接很容易变得陈旧,并且依赖于单个现有连接,如果不重新启动应用程序,则无法恢复。

还有其他不好的地方。 例如,通常连接是同步的,因此如果以这种方式构建具有多个并发用户的Web应用程序,则会限制应用程序的并发性。 但是,您的应用程序无法从瞬态问题中恢复,这足以使其值得修复。

Connection的文档声明它扩展了AutoCloseable. AutoCloseable的文档声明,当类是“不再需要时必须关闭的资源”时,类会扩展它 它提供了Close方法,你的朋友应该使用它。

ResultSet还扩展了AutoCloseable ,但PreparedStatement没有。

他可能使用相同的连接来执行所有SQL处理。 这不是一个糟糕的技术; 但是,如果他没有编写干净关闭的代码,那么很难知道何时关闭唯一的连接。

所以我打赌这个代码的基本原理是让进程死掉,让套接字因此而死,然后让远程数据库最终清理连接。 它是否有效,是的。 这是令人讨厌的,也是容易发生问题的地方,是的。

解决这个问题的方法是找到你的主循环。 一直在运行。 然后,您需要通过在主处理循环之后放置关闭逻辑来控制关闭。 最后,您需要清除所有System.exit(...)调用的代码。

我假设你提到代码是inheritance的,它是Java 1.6或更低版本。 在1.7及更高版本中,您可以在使用try with resources语言构造的try with resources使用它时隐式关闭Closeable