[英]Why are Queries in JDBI closeable?
我有一個 Java 應用程序,它使用 JDBI 作為我的數據庫代碼。 我有許多 DAO,它們大致使用以下結構進行查詢:
return handle.createQuery(sql)
.bind("variable", variable)
.mapToBean(Bean.class)
.list();
其中handle
是 JDBI Handle
對象。 我在交易結束時關閉應用程序中其他地方的句柄。
我用 SonarQube 掃描了我的代碼,它抱怨我打開了實現AutoCloseable
JDBI Query
對象,但沒有關閉它們。 SonarQube 建議在 try-with-resources 中關閉它們,如下所示:
try(Query query = handle.createQuery(sql)){
return query.bind("variable", variable)
.mapToBean(Bean.class)
.list();
}
我擔心這可能會關閉底層句柄或我需要在事務中發生的其他查詢的其他資源。 我也懷疑他們是否需要關閉。 為什么 JDBI 使這些 Query 對象可關閉? 我沒有在文檔中找到任何表明他們打開了哪些資源的內容。 SonarQube 是正確的還是可以安全地忽略?
謝謝。
JDBI 查詢是 JDBC 語句和 ResultSet 的包裝器,其中 ResultSet 又包裝了一個數據庫游標。 關閉查詢會關閉 Statement 和 ResultSet,這會解除游標的分配,從而釋放數據庫資源。 一個數據庫一次可以打開的游標數量是有限制的。 關閉查詢不會關閉數據庫連接。
如果 Sonarqube 知道有關 JDBI 的任何具體信息,我會感到驚訝,它似乎只是遵循一條規則,說明任何 AutoCloseable 都應該關閉。 即便如此,對於大多數事情來說,這並不是一個糟糕的規則。 我會聽聽 Sonarqube 的聲音並關閉查詢。
關閉連接應該會為您清除所有相關的游標,但最好在您完成它們后立即讓它們離開,因為這樣可以讓數據庫服務器更有效地工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.