[英]How are JDBC connections implemented?
我有一個項目,在其中使用HikariCP
進行JDBC連接池。 而且HikariCP可以很好地滿足我的需求。 它還如下記錄池的統計信息。
2014-12-03 10:16:08 DEBUG HikariPool:559 - Before cleanup pool stats loginPool (total=8, inUse=0, avail=8, waiting=0)
2014-12-03 10:16:08 DEBUG HikariPool:559 - After cleanup pool stats loginPool (total=7, inUse=1, avail=7, waiting=0)
出於實驗目的,我使用MySQL Workbench
關閉了已配置數據庫的所有MySQL
連接。 但是,盡管沒有到數據庫的實際連接,我仍然看到HikariCP
像以前一樣記錄了統計信息。 當有連接請求時,它立即建立了連接(初始8),因此一切正常。
因此,我的問題是如何管理或實現這些連接? 我認為HikariCP
記錄統計數據(好像有連接)的原因是因為它在內存中具有對連接的有效引用,而這些連接實際上是不存在的(使用數據庫)。
我的理解正確嗎?
連接池在啟動時創建了8個連接。 您說您使用工作台斷開了它們的連接。 大多數連接池在使用之前都不知道連接已斷開。
您的假設是正確的。 您手動終止了連接,但是該池有一個假定已連接的8個套接字的句柄。 給定時間,您的連接池可能已經檢查了連接的有效性,並試圖重新連接它們。 我不能代表HikariCP,但這就是現代連接池的作用。
當使用MySQL Workbench關閉連接時,就是在服務器端關閉它們。 在JDBC(客戶端)端,以前建立的連接將一直存在,直到客戶端代碼嘗試使用它們為止。 到那時,它們會被發現“損壞”; 即客戶端嘗試使用它們時將獲得異常。
客戶端JDBC連接對象僅在Java應用程序代碼將它們返回到連接池時才關閉或回收。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.