2017-02-04 1 views
5

内部try-with-resourcesを置くことは必須ですか、またはtry-with-resourceのいずれかの内部のすべてがautoclosedされますか? try-と、リソースブロックで内部try-with-resourceを置くことは必須ですか、またはtry-with-resourceのいずれかの中のすべてがautoclosedされますか?

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つだけを使用し、'; 'を使って複数の文を置くことです。そして、それはすべてを閉鎖する世話をするでしょう。 –

+1

ありがとうございます@ジャック・ジェイ、それは私が知りたかったものです – DevDio

答えて

4

try文で唯一の資源は、try-と資源構築物により自動的閉じられます。ブロック内の他のリソースは無関係であり、管理する必要があります(*)

しかし、あなたの代わりに使用するのでは、try文で を複数のリソースを置くことができ、複数のトライ・リソースで例えば(各リソースに1つ):

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良い点。この質問はリソースの試行のメカニズムに関するものです。 'Statement'が閉じられたときに' ResultSet'が閉じられるのは間違いありませんが、これはtry-with-resourcesが原因ではありません。これを指摘してくれてありがとう、私の答えを明らかにした。 – janos

関連する問題