0

以下に示すようにクエリを作成しました-

    Connection dbConnection = null;
    PreparedStatement preparedStatement = null;
    ResultSet rs = null;
    try {

        String fetchOneSQL = "select p.NAME from PAPER p where  p.PAPERID="+paperId;
        dbConnection = icrudResultAnalysis.getConnection();
        preparedStatement = dbConnection.prepareStatement(fetchOneSQL);
        rs = preparedStatement.executeQuery();

        while (rs.next()) {
            Paper paper=new Paper();                
            paper.setName(rs.getString(NAME));              
        }

        // get new records list
        preparedStatement=null;
        rs=null;

        String getListSql="select ib.NAME from ITEMBANK ib  where ib.ITEMBANKID="+itemBankId;
        preparedStatement = dbConnection.prepareStatement(getListSql);
        rs = preparedStatement.executeQuery();

        while (rs.next()) {
            ItemBank itemBankObj=new ItemBank();
            itemBankObj.setName(rs.getString(NAME));
            listItemBanks.add(itemBankObj);
        }

        rs.close();
        preparedStatement.close();
        dbConnection.close();

    } catch (Exception e) {
        LOGGER.error("Exception Occured while fetching All record: "
                + e.getMessage());
    } finally {

        try{
            if (rs!=null){
                rs.close();
            }
        }catch(SQLException e)
        {
            LOGGER.error(RESULTSETCLOSEEXCEPTION    + e.getMessage());
        }

        try {
            if (preparedStatement != null) {
                preparedStatement.close();
            }
        } catch (SQLException e) {
            LOGGER.error(STATEMENTCLOSEEXCEPTION
                    + e.getMessage());
        }
        try {
            if (dbConnection != null) {
                dbConnection.close();
            }
        } catch (SQLException e) {
            LOGGER.error(CONNECTIONCLOSEEXCEPTION
                    + e.getMessage());
        }
    }

上記のコードでは、 ResulSet rs =nullを作成して、2 つの select ステートメントに単一の結果セットを使用しました。それは良い習慣ですか?または、毎回ResultSetを閉じる必要がありますか? ResultSetを閉じることとResultSetをnullにすることの違いは何ですか?

4

2 に答える 2

4

.close()メソッドを使用した後は、すべてのリソースを閉じる必要があります。そして、この場合を除いて、resultSet は例外ではありません ( ResultSet javadocから):

A ResultSet object is automatically closed when the Statement object that generated it is closed, re-executed, or used to retrieve the next result from a sequence of multiple results.

あなたの場合.close()、最初に開いた結果セットを手動で作成する必要がありますが、2 番目に使用する必要はありません。resultSet = null変数resultSetequalsへの唯一のセット参照を作成しnull、それ以上でもそれ以下でもありません。
Java7 を使用している場合、Resultset は AutoCloseable を実装しており、この機能を使用してコードをよりクリーンな方法で書き直すことができます ( Oracle docを参照) 。

于 2013-08-14T18:57:08.097 に答える
0

リソース (resultSet、PrepareStatement) を再利用する場合、それらを最初に閉じる必要があります...準備ステートメントを NULL に設定する代わりに、それを閉じる必要があり、自動的に結果セットを閉じます。明示的に閉じる必要はありません結果セット。

于 2013-08-15T05:48:47.590 に答える