gpt4 book ai didi

java - 调试时不关闭数据库连接有问题吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:54:26 26 4
gpt4 key购买 nike

我有一个 Java 应用程序,它在开始时打开与数据库的连接,并在结束时关闭它。但是,程序并不总是完成,因为抛出异常或者我正在调试它并在中途停止。

这会导致打开的连接堆积并减慢数据库速度,还是会自动清理?

最佳答案

数据库连接由数据库拥有和管理,该类只允许您访问该数据库资源。如果您不关闭连接,则 Java 类可能会被垃圾回收,但数据库可能无法判断连接不再被使用,这可能会导致数据库资源被浪费(直到数据库端超时) 甚至泄漏。

因此,当您使用完Connection 后,您应该确定通过调用它的close() 显式关闭它方法。这将允许垃圾收集器尽早重新收集内存,更重要,它会释放连接可能占用的任何其他数据库资源(游标、句柄等)。

在 Java 中执行此操作的传统方法是在finally 当你用完它们时阻塞,安全模式看起来像这样:

Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;

try {
// Do stuff
...

} catch (SQLException ex) {
// Exception handling stuff
...
} finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) { /* ignored */}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) { /* ignored */}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) { /* ignored */}
}
}

finally block 可以稍微改进为(以避免空检查):

} finally {
try { rs.close(); } catch (Exception e) { /* ignored */ }
try { ps.close(); } catch (Exception e) { /* ignored */ }
try { conn.close(); } catch (Exception e) { /* ignored */ }
}

但是,这仍然非常冗长,所以您通常最终会使用一个辅助类来关闭空安全辅助方法中的对象,并且 finally block 变成这样:

} finally {
DbUtil.closeQuietly(rs);
DbUtil.closeQuietly(ps);
DbUtil.closeQuietly(conn);
}

实际上,Apache Commons DbUtils有一个DbUtils正是这样做的类,因此无需编写自己的类。

在您的情况下,这将解决异常问题,但不能解决调试问题(并且您将浪费数据库资源,直到数据库端发生超时)。所以 1. 不要使用生产数据库调试代码 2. 尝试执行调试 session 直到结束。

关于java - 调试时不关闭数据库连接有问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2121805/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com