0

そのコードはパフォーマンスに影響を与えていますか、それともメモリリークを引き起こしていますか? ここで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;
}
4

2 に答える 2

0

を閉じている間、それに関連付けられているステートメントをResultSet閉じていません。ブロックPreparedStatementで行うべきことは次のとおりです。finally

rs.getStatement().close();

これにより、関連付けられたステートメントが確実に閉じられます。また、 Javadocに従って、

ResultSet オブジェクトは、それを生成した Statement オブジェクトが閉じられるか、再実行されるか、複数の結果のシーケンスから次の結果を取得するために使用されると、自動的に閉じられます。

つまり、前述のコードを使用してステートメント オブジェクトを閉じると、事実上 ResultSet オブジェクトも閉じられます。

于 2012-09-06T05:18:24.380 に答える
0

技術的には、ResultSet を閉じるのではなく、データベース接続自体を閉じる必要があります。データベース操作が完了したときにデータベース接続を閉じれば、これによってメモリ リークが発生することはありません。

于 2012-09-05T19:38:30.927 に答える