【发布时间】:2012-01-08 01:55:47
【问题描述】:
由于我使用 JDBC,我的应用程序出现了内存泄漏。我通过查看堆的可视转储并查看数千个 ResultSet 实例和相关对象来验证这一点。那么,我的问题是如何适当地管理 JDBC 使用的资源,以便对它们进行垃圾收集?我是否需要为使用的每个语句调用“.close()”?我是否需要对 ResultSet 本身调用“.close()”?
你将如何释放调用使用的内存:
ResultSet rs = connection.createStatement().executeQuery("some sql query");
??
我发现还有其他非常相似的问题。抱歉,如果这是多余的,但要么我不太了解答案,要么它们似乎并不普遍适用。我正在尝试就使用 JDBC 时如何管理内存给出权威答案。
::EDIT:: 添加一些代码示例
我有一个基本上是 JDBC 帮助器的类,我用它来简化数据库交互,主要的两种方法是执行插入或更新,以及执行选择语句。
这个用于执行插入或更新语句:
public int executeCommand(String sqlCommand) throws SQLException {
if (connection == null || connection.isClosed()) {
sqlConnect();
}
Statement st = connection.createStatement();
int ret = st.executeUpdate(sqlCommand);
st.close();
return ret;
}
还有这个用于从选择中返回结果集:
public ResultSet executeSelect(String select) throws SQLException {
if (connection == null || connection.isClosed()) {
sqlConnect();
}
ResultSet rs = connection.createStatement().executeQuery(select);
return rs;
}
使用executeSelect()方法后,我总是调用resultset.getStatement().close()
使用对象分配跟踪检查堆转储,显示语句仍被这两种方法保留...
【问题讨论】:
-
确保关闭
try { } finally块中的结果集和语句并将两者都设置为 null。使用这些的代码应该在块内 -
如果您添加了您使用的典型 jdbc 执行代码,如果您没有释放任何 jdbc 资源,我们发表评论可能会更有帮助。
标签: java memory-management jdbc memory-leaks