我的应用程序由于使用JDBC而导致内存泄漏。我通过查看堆的可视转储并查看了数千个ResultSet实例和关联对象来验证了这一点。那么,我的问题是,如何适当地管理JDBC使用的资源,以便可以对其进行垃圾回收?我是否需要为每个使用的语句调用“ .close()”?我需要在ResultSet本身上调用“ .close()”吗?

您将如何释放呼叫使用的内存:

ResultSet rs = connection.createStatement().executeQuery("some sql query");


??

我看到还有其他非常相似的问题。道歉,如果这是多余的,但要么我没有完全听从答案,要么它们似乎没有普遍适用。我正在尝试获得有关使用JDBC时如何管理内存的权威性答案。

:: EDIT ::添加一些代码示例

我有一个基本上是JDBC帮助程序的类,用于简化数据库交互,主要的两种方法是执行插入或更新以及执行select语句。

这用于执行插入或更新语句:

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;
}


而这个用于从选择中返回ResultSets:

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()

检查堆转储的对象分配跟踪是否显示了这两种方法仍然保留的show语句...

最佳答案

如果不打算重复使用该语句,则应将其关闭。通常,首先关闭ResultSet是一个很好的形式,因为某些实现没有自动关闭ResultSet(即使应该关闭)。

如果要重复相同的查询,则可能应使用PreparedStatement减少解析开销。而且,如果您向查询中添加参数,则您实际上应该使用PreparedStatement以避免SQL注入的风险。

关于java - 释放JDBC资源,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8298694/

10-12 02:41