2017-02-04 67 views
5

是否强制将内部尝试与资源配合使用,或者其中一个资源尝试中的所有内容都将被自动关闭?是否强制将内部尝试与资源配合使用,或者其中一个资源尝试中的所有内容都将被自动关闭?

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声明, 而是采用多种尝试,与资源(每个资源),例如:

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好点。这个问题是关于试用资源机制。你说'ResultSet'在'Statement'被关闭时关闭了,但这不是因为try-with-resources。我澄清了我的答案,谢谢你指出这一点。 – janos