【问题标题】:prepare statement object is not closed准备语句对象未关闭
【发布时间】:2012-09-05 19:04:57
【问题描述】:

该代码是否会影响性能或导致任何内存泄漏?这里PreparedStatement 对象没有关闭,也没有关闭的引用。对此有何建议?

private ResultSet getEmpData(String query){
    ResultSet rs = null;
    try {
        rs = connection.prepareStatement(query).executeQuery();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return rs;
}

public int getEmployeeSalary(){

    ResultSet rs = null;
    int salary  = 0 ;
    try {
        rs = getEmpData("SELECT SALARY FROM EMP WHERE NAME ='SAM'");
        while (rs.next()) {
            salary = rs.getInt(1);
        }
    } catch (SQLException e) {
    }finally{
        if (rs!= null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    return salary;
}

【问题讨论】:

    标签: java jdbc prepared-statement


    【解决方案1】:

    当您关闭ResultSet 时,您并没有关闭与之关联的PreparedStatement 语句。您应该在 finally 块中执行以下操作:

    rs.getStatement().close();
    

    这将确保关联的语句是关闭的。同样根据Javadoc

    当 Statement 对象时,ResultSet 对象会自动关闭 生成它的对象被关闭、重新执行或用于检索下一个 多个结果的序列。

    这意味着当您使用上述代码关闭语句对象时,您实际上也关闭了 ResultSet 对象。

    【讨论】:

      【解决方案2】:

      从技术上讲,您不应该关闭 ResultSet,而应该关闭数据库连接本身。如果您在完成我们的数据库操作后关闭数据库连接,这不会导致内存泄漏。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-01
        • 2019-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多