簡體   English   中英

JDBC 未關閉的連接

[英]JDBC unclosed connections

如果我們忘記在代碼中關閉 Java JDBC 連接(比如 oracle),想知道連接會永遠停留在 DB 端(oracle)還是 Oracle 在其末端有任何實現在一段時間后自動釋放 DB 連接?

try{
       ds.getConnection();
       //do some business logic

   }catch(Exception e){
       //handle exceptions

   }  finally{
           //let's say DB connection is NOT cosed..
      }

上面代碼中打開的連接會發生什么? java程序退出后,連接是否會在數據庫端自動釋放? 我知道不關閉數據庫連接是非常不推薦和不好的做法。 我只想知道其中的含義並了解 oracle 如何處理未關閉的連接。

一旦 VM 終止,無論是正常情況(所有非守護線程結束,調用 System.exit,或接收到終止信號,例如在終端中按 CTRL+C),還是異常(您絆倒一個電源線或終止信號會導致內核硬退出您的虛擬機),所有 TCP/IP 連接都會自動消失,並且連接將被清除。

但是,在 VM 退出之前,您無法獲得任何保證。 該行為是故意未指定的(例如,您必須自己關閉它們。如果您不這樣做,則不提供任何保證),實際發生的情況取決於您的計算機狀態(因為它取決於 gc 運行以及何時關閉取決於從音樂播放器中播放的歌曲到月相的所有內容),以及正在使用的 JDBC 驅動程序。

您可以使用 lint 工具和 IDE 插件來識別您沒有關閉連接。 此外,您的代碼段已過期 10 多年。 確保您的連接不會死在您身上的推薦且更簡單的方法是使用:

try (Connection con = ds.getConnection()) {
    // use 'con' here
} // no need for a catch or finally.

或者,使用連接池(如 HikariCP),以及使 JDBC 不那么煩人的抽象,如 JDBI 或 JOOQ。

暫無
暫無

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

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