[英]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.