我正在阅读最后一位在系统上工作的开发人员的代码,他从不关闭与数据库的任何连接。他只关闭PreparedStatement
和ResultSet
个连接,但从不关闭连接。
系统不使用连接池。
有没有理由不关闭所有内容(Connection
,PreparedStatement
和ResultSet
)?
答案 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
没有扩展。