JDBC數據庫連接池

DriverManager的實現方式一般是在主程序中建立數據庫的連接,然後進行數據庫的操作,操作完畢後斷開數據庫連接。然而這種模式存有一些問題。

  1. 普通的JDBC數據庫連接使用 DriverManager 來獲取,每次向數據庫建立連接的時候都要將 Connection 加載到內存中,再驗證用戶名和密碼(得花費0.05s~1s的時間)。需要數據庫連接的時候,就向數據庫要求一個,執行完成後再斷開連接。這樣的方式將會消耗大量的資源和時間。數據庫的連接資源並沒有得到很好的重複利用.若同時有幾百人甚至幾千人在線,頻繁的進行數據庫連接操作將佔用很多的系統資源,嚴重的甚至會造成服務器的崩潰。
  2. 對於每一次數據庫連接,使用完後都得斷開。否則,如果程序出現異常而未能關閉,將會導致數據庫系統中的內存泄漏,最終將導致重啓數據庫。
  3. 這種開發不能控制被創建的連接對象數,系統資源會被毫無顧及的分配出去,如連接過多,也可能導致內存泄漏,服務器崩潰。

數據庫連接池(connection pool)

  • 爲解決傳統開發中的數據庫連接問題,可以採用數據庫連接池技術。
  • 數據庫連接池的基本思想就是爲數據庫連接建立一個“緩衝池”。預先在緩衝池中放入一定數量的連接,當需要建立數據庫連接時,只需從“緩衝池”中取出一個,使用完畢之後再放回去。
  • 數據庫連接池負責分配、管理和釋放數據庫連接,它允許應用程序重複使用一個現有的數據庫連接,而不是重新建立一個。
  • 數據庫連接池在初始化時將創建一定數量的數據庫連接放到連接池中,這些數據庫連接的數量是由最小數據庫連接數來設定的。無論這些數據庫連接是否被使用,連接池都將一直保證至少擁有這麼多的連接數量。連接池的最大數據庫連接數量限定了這個連接池能佔有的最大連接數,當應用程序向連接池請求的連接數超過最大連接數量時,這些請求將被加入到等待隊列中。

數據庫連接池工作原理

數據庫連接池技術的優點

資源重用:

  • 由於數據庫連接得以重用,避免了頻繁創建,釋放連接引起的大量性能開銷。在減少系統消耗的基礎上,另一方面也增加了系統運行環境的平穩性。

更快的系統反應速度

  • 數據庫連接池在初始化過程中,往往已經創建了若干數據庫連接置於連接池中備用。此時連接的初始化工作均已完成。對於業務請求處理而言,直接利用現有可用連接,避免了數據庫連接初始化和釋放過程的時間開銷,從而減少了系統的響應時間

新的資源分配手段

  • 對於多應用共享同一數據庫的系統而言,可在應用層通過數據庫連接池的配置,實現某一應用最大可用數據庫連接數的限制,避免某一應用獨佔所有的數據庫資源

統一的連接管理,避免數據庫連接泄露

  • 在較爲完善的數據庫連接池實現中,可根據預先的佔用超時設定,強制回收被佔用連接,從而避免了常規數據庫連接操作中可能出現的資源泄露

兩種開源的數據庫連接池

  • JDBC 的數據庫連接池使用 javax.sql.DataSource 來表示,DataSource 只是一個接口,該接口通常由服務器(Weblogic, WebSphere, Tomcat)提供實現,也有一些開源組織提供實現:

    • DBCP 數據庫連接池
    • C3P0 數據庫連接池
  • DataSource 通常被稱爲數據源,它包含連接池和連接池管理兩個部分,習慣上也經常把 DataSource 稱爲連接池

DBCP 數據源

  • DBCP 是 Apache 軟件基金組織下的開源連接池實現,該連接池依賴該組織下的另一個開源系統:Common-pool. 如需使用該連接池實現,應在系統中增加如下兩個 jar 文件:
    • Commons-dbcp.jar:連接池的實現
    • Commons-pool.jar:連接池實現的依賴庫
  • Tomcat 的連接池正是採用該連接池來實現的。該數據庫連接池既可以與應用服務器整合使用,也可由應用程序獨立使用。

數據源使用範例

  • 數據源和數據庫連接不同,數據源無需創建多個,它是產生數據庫連接的工廠,因此整個應用只需要一個數據源即可。
  • 當數據庫訪問結束後,程序還是像以前一樣關閉數據庫連接:conn.close(); 但上面的代碼並沒有關閉數據庫的物理連接,它僅僅把數據庫連接釋放,歸還給了數據庫連接池

DBCP的使用

c3p0的使用

以上就是我的分享,感謝各位大佬們耐心看完文章,最後再分享一個我自己的後端技術羣,羣裏自己收集了很多Java架構資料,大家可以進羣免費領取羣號:680075317,也可以進羣一起交流,比如遇到技術瓶頸、面試不過的,大家一些交流學習!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章