2017-02-04 12 views
5

Обязательно ли использовать внутренние ресурсы try-with-resources или все внутри одного из try-in-resources будет автоматически закрыто?Обязательно ли использовать внутренние ресурсы try-with-resources или все внутри одного из try-with-resources будет автоматически закрыто?

try (BasicDataSource ds = BasicDataSourceFactory.createDataSource(dsProperties)) { 

     // still necessary for Connection to close if inside 
     // try-with-resources? 
     try (Connection conn = ds.getConnection()) { 

      String sql = "SELECT * FROM users"; 
      try (PreparedStatement stmt = conn.prepareStatement(sql)) { 

       try (ResultSet rs = stmt.executeQuery()) { 

        while (rs.next()) { 
         System.out.println(rs.getString("email")); 
         System.out.println(rs.getString("password")); 
        } 

       } 
      } 

     } 

    } catch (SQLException e) { 

     e.printStackTrace(); 
    } catch (Exception e) { 

     e.printStackTrace(); 
    } 
+1

Почему вы используете множество 'try-with-resources', используйте только один и поместите несколько операторов, используя'; '. И он позаботится о том, чтобы закрыть все. –

+1

спасибо @jack jay, это было именно то, что я хотел знать – DevDio

ответ

4

В блоке примерочных с-ресурсами, только ресурсы в try заявление будет закрыто автоматически по конструкции примерочных с-ресурсами. Другие ресурсы внутри блока не связаны и должны управляться (*).

Однако, вы можете поместить несколько ресурсов в try заявлении вместо использования нескольких примерочных с-ресурсов (по одному для каждого ресурса), например:

try (PreparedStatement stmt = conn.prepareStatement(sql); 
    ResultSet rs = stmt.executeQuery()) { 
    while (rs.next()) { 
     System.out.println(rs.getString("email")); 
     System.out.println(rs.getString("password")); 
    } 
} 

(*) Как @alexander-farber остроконечный в комментарии есть также некоторые ресурсы, которые автоматически закрываются другим механизмом, например, ResultSet закрывается, когда Statement, который сгенерировал его, закрывается. Хотя вы не управляете этими ресурсами явно, они управляются их реализацией.

+0

Ваше утверждение «Только ресурсы в операторе try будут автоматически закрыты» неверно, потому что [объект ResultSet автоматически закрывается объектом Statement, который сгенерировал его] (https://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html#close%28%29). –

+1

@AlexanderFarber хорошо пункт. Этот вопрос касается механизма try-with-resources. Вы правы, что 'ResultSet' закрывается, когда' Statement' закрывается, но это происходит не из-за попыток-с-ресурсами. Я уточнил свой ответ, спасибо за это. – janos