0

私は春F / wの非常に新しいです。アプリケーションで永続レイヤーとしてSpring jdbcとSpring ORMを使用しています。複数回呼び出すメソッドでは、結果セット オブジェクトとステートメント オブジェクトを閉じる必要があるのでしょうか。サンプルコードは次のとおりです。

public   void  savedata() throws Throwable
    {
        Connection connection = null;
        try 
            {
            int lastUpdated= jdbcTemplate.queryForInt("select serial_id from serial_details ");
        SerialUpdated=jdbcTemplate.queryForInt("select count(* ) from serial_usg  where serial_bill is null  " +
                    " and SURROGATE_KEY > "+lastUpdated);

            connection = dataSource.getConnection();
            String Query = "select * from serial_mst where serial_bill is null  and " +
                    "SURROGATE_KEY  > "+ lastUpdated ;
            PreparedStatement pStatement = connection.prepareStatement(Query);          
            ResultSet rs = pStatement.executeQuery();       
            while(rs.next()){
                String data     = rs.getString("serial_bill");                          
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }               
            }

        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            if(connection != null && !connection.isClosed()){
                connection.close();
                connection = null;
            }           
        } 

私の質問は、このメソッドを複数回呼び出す場合、ステートメントと結果セットのメソッドを閉じる必要がありますか、それとも接続オブジェクトだけで十分です。

4

1 に答える 1

0

結果セットではなく接続のみを閉じる場合の問題の 1 つは、接続管理コードが接続プールを使用している場合、接続がプールにconnection.close()戻されることです。さらに、一部のデータベースでは、サーバー上にカーソル リソースがあり、明示的に閉じないと適切に解放されません。

以下は、finally ブロックから使用できるユーティリティ メソッドです。

public static void closeEverything(ResultSet rs, Statement stmt,
        Connection con) {
    if (rs != null) {
        try {
            rs.close();
        } catch (SQLException e) {
        }
    }
    if (stmt != null) {
        try {
            stmt.close();
        } catch (SQLException e) {
        }
    }
    if (con != null) {
        try {
            con.close();
        } catch (SQLException e) {
        }
    }
}
于 2013-10-15T07:40:01.593 に答える