簡體   English   中英

嘗試使用連接池和單個連接的資源

[英]Try with resources using a connection pool and single connection

在代碼審查期間,我發現了以下代碼片段:

try (
   Connection con = new SqlSessionFactoryBuilder()
    .build(configuration)
    .buildFactory()
    .openSession()
    .getConnection()
){
   // do stuff here with 'con' and not close anything   
}

Session、Connection、SqlSessionFactory 是 iBatis 實現,但問題對 Closable 接口的任何“堆疊”實現感興趣。

我假設“嘗試使用資源”關閉資源,即實例化 - 在這種情況下是con 通常你會關閉 session 並單獨連接每個。 如果使用上面的代碼, close()方法只會在con object 上被調用,所以 session 沒有被顯式調用並且會依賴垃圾回收?

使用以下代碼是否會更好:

try (
   Session session = new SqlSessionFactoryBuilder()
    .build(configuration)
    .buildFactory()
    .openSession(); 
   Connection con = session.getConnection();
){
   // do stuff here with 'con' and not close anything
}

后一種方法在我看來似乎更干凈,因為它應該正確調用close() 或者我的解釋是錯誤的,只是樣板代碼?

您的解釋是正確的,try-with-resources 只會關閉在資源塊中明確聲明的資源。

但是,在大多數情況下,第一種方法也可以。 這是因為通常當某些Closeable使用另一個Closeable時,它會嘗試在其close()方法內關閉它。 這種機制與垃圾收集器沒有任何關系(它只會刪除 object 而不會釋放資源)。

除了Closeable不會關閉其資源的情況外,在第一種方法中也可能存在其他資源泄漏源。 考慮以下情況:

try(BufferedInputStream bufferedInput = new BufferedInputStream(
                                            new FileInputStream("file.txt"))
)

在此示例中,將首先創建FileInputStream 就在那時它將被傳遞給BufferedInputStream的構造函數。 在創建BufferedInputStream過程中發生異常時會發生什么? FileInputStream永遠不會關閉。 另一方面,當您將它們聲明為兩個單獨的資源時,如下所示:

try(FileInputStream input = new FileInputStream("file.txt");
    BufferedInputStream bufferedInput = new BufferedInputStream(input)
)

Java 本身將確保關閉這兩個資源。 以下內容在JSL - 14.20.3.1 中進行了說明。 基本的資源嘗試

在管理多個資源的基本 try-with-resources 語句中:

如果資源的初始化由於拋出值 V 而突然完成,則:

如果所有成功初始化的資源(可能為零)的自動關閉正常完成,則 try-with-resources 語句會因為拋出值 V 而突然完成。

可能還有更多可能導致資源泄漏的情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM