2013-08-14 4 views
0

Я написал запрос, как указаноЗакрытие ResultSet должно или нет?

цен ниже
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 = нуль. Это хорошая практика? Или мне нужно каждый раз закрывать ResultSet? В чем разница между закрытием ResultSet и получением ResultSet null?

+1

Что говорит javadoc ResultSet.close()? –

+1

Вы должны закрыть * любой * ресурс, как только закончите с ним. – EJP

ответ

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() первый открытый набор результатов, но не обязательно второй используется; изготовление resultSet = null только установить ссылку на переменную resultSet равно null, не более и не менее.
Если вы используете Java7, Resultset реализует AutoCloseable и вы можете использовать эту функцию, чтобы переписать код в более экологичном способе (смотрите Oracle doc)

0

Когда вы повторное использование ресурсов (Resultset, PrepareStatement), они должны быть закрыто первое ... Вместо того, чтобы устанавливать инструкцию подготовки к NULL. Вы должны закрыть ее, и она автоматически закроет результирующий набор. Нет необходимости явно закрывать результирующий набор.

Смежные вопросы