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

时间:2014-08-11 17:39:24

标签: java jdbc prepared-statement

我正在阅读最后一位在系统上工作的开发人员的代码,他从不关闭与数据库的任何连接。他只关闭PreparedStatementResultSet个连接,但从不关闭连接。

系统不使用连接池。

有没有理由不关闭所有内容(ConnectionPreparedStatementResultSet)?

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:1)

documentation for Connection表示它扩展AutoCloseable. documentation for AutoCloseable表示类在" A资源必须关闭时扩展它不再需要。" 它提供了一种Close方法,你的朋友应该使用它。

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