java - 释放 JDBC 资源

标签 java memory-management jdbc memory-leaks

我的应用程序由于使用 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/

相关文章:

带有默认时间戳列值的 mysql LOAD DATA LOCAL INFILE

java - 根据用户输入显示数字的出现...数组,java

java - AutoConfigureMybatis注解是什么意思?

java - 尚未为当前线程设置 GLCapability 实例

memory - MEM_RESERVE 和 MEM_COMMIT 状态之间的确切区别是什么?

java - 使用JDBC 8连接到Excel

java - Java 中的枚举基类

从 findWithinHorizo​​n 返回的 Java 大字符串转换为 InputStream

c - 当 C 中的静态分配没有足够的内存时会发生什么?

Java 忽略类路径