如果 ResultSet 关闭但 PreparedStatement 不关闭,我预计会发生什么类型的资源泄漏。非常可疑,它会导致打开游标问题...
PreparedStatement p = connection.prepareStatement(...);
try {
ResultSet r = p.executeQuery();
try {
while (r.next()) {
....
}
} finally {
try {
r.close();
} catch (SQLException e) {
// log this or something -- prevent these from masking original exception
}
}
}
是Oracle 11g,jdbc 11.2.0.3
谢谢
请尝试回答我的问题,不要专注于修复
最佳答案
What type of resource leak can I expect if ResultSet is closed, but PreparedStatement not ?
泄漏将是最大的打开游标问题。
ORA-01000: maximum open cursors exceeded
如果超过最大打开游标数,数据库将变得不可用,除了已经持有的游标。但是,大多数情况下,发生这种情况时,甚至不会使用保持的游标(您的问题就是这种情况)。
从 Java 7 开始,处理这个问题的最佳方法是使用 try with ressources . ResultSet
和 PreparedStatement
都实现了 AutoCloseable
接口(interface),这意味着它们将在不再需要时关闭。
如果您没有 Java 7,则需要在 finally
block 中处理此问题,但请确保在关闭之前验证空值,否则如果资源从未存在,您可能会遇到 NPE初始化。
请注意,反向不会导致任何问题,因为关闭语句会自动关闭它的结果集。
请注意,您可以轻松地为您的应用程序允许更多游标,以减少超过最大值的可能性。
ALTER SYSTEM SET open_cursors = 400 SCOPE=BOTH;
但是,大多数情况下,如果您遇到最大打开游标,这不应该是一个解决方案,因为它只会隐藏真正的问题。
关于java - 关闭 ResultSet 但不关闭 PreparedStatement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28968990/