prepare语句对象未关闭

时间:2012-09-05 19:04:57

标签: java jdbc prepared-statement

该代码是否会影响性能或导致任何内存泄漏?此处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;
}

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

rs.getStatement().close();

这将确保关闭相关语句。同样根据Javadoc

  

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

这意味着当您使用上述代码关闭语句对象时,您还可以有效地关闭ResultSet对象。