我的应用程序由于使用 JDBC 而导致内存泄漏。我通过查看堆的可视化转储并查看数千个 ResultSet 实例和关联对象来验证这一点。那么,我的问题是如何适本地管理 JDBC 使用的资源以便它们可以被垃圾收集?我是否需要为使用的每个语句调用“.close()”?我是否需要对结果集本身调用“.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()
检查带有对象分配跟踪的堆转储显示仍然从这两种方法保留的语句...
最佳答案
如果您不打算重用它,您应该关闭它。首先关闭 ResultSet 通常是一种很好的形式,因为某些实现不会自动关闭 ResultSet(即使它们应该关闭)。
如果您要重复相同的查询,您可能应该使用 PreparedStatement 来减少解析开销。如果您向查询添加参数,您确实应该使用 PreparedStatement 来避免 sql 注入(inject)的风险。
关于java - 释放 JDBC 资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8298694/