淺談一下數據庫連接池Druid德魯伊
JDBC數據庫連接池的必要性
在使用開發(fā)基于數據庫的web程序時,傳統的模式基本是按以下步驟
在主程序(如servlet、beans)中建立數據庫連接
進行sql操作
斷開數據庫連接
這種模式開發(fā),存在的問題:
普通的JDBC數據庫連接使用 DriverManager 來獲取,每次向數據庫建立連接的時候都要將 Connection加載到內存中,再驗證用戶名和密碼(得花費0.05s~1s的時間)。需要數據庫連接的時候,就向數據庫要求 一個,執(zhí)行完成后再斷開連接。這樣的方式將會消耗大量的資源和時間。數據庫的連接資源并沒有得到很 好的重復利用。若同時有幾百人甚至幾千人在線,頻繁的進行數據庫連接操作將占用很多的系統資源,嚴 重的甚至會造成服務器的崩潰。
對于每一次數據庫連接,使用完后都得斷開。否則,如果程序出現異常而未能關閉,將會導致數據庫系統 中的內存泄漏,最終將導致重啟數據庫。(回憶:何為Java的內存泄漏?)
這種開發(fā)不能控制被創(chuàng)建的連接對象數,系統資源會被毫無顧及的分配出去,如連接過多,也可能導致內 存泄漏,服務器崩潰。
數據庫連接池技術
為解決傳統開發(fā)中的數據庫連接問題,可以采用數據庫連接池技術。 數據庫連接池的基本思想:就是為數據庫連接建立一個“緩沖池”。預先在緩沖池中放入一定數量的連接,當需要 建立數據庫連接時,只需從“緩沖池”中取出一個,使用完畢之后再放回去。
數據庫連接池負責分配、管理和釋放數據庫連接,它允許應用程序重復使用一個現有的數據庫連接,而不是重 新建立一個。
數據庫連接池在初始化時將創(chuàng)建一定數量的數據庫連接放到連接池中,這些數據庫連接的數量是由最小數據庫 連接數來設定的。無論這些數據庫連接是否被使用,連接池都將一直保證至少擁有這么多的連接數量。連接池 的最大數據庫連接數量限定了這個連接池能占有的最大連接數,當應用程序向連接池請求的連接數超過最大連 接數量時,這些請求將被加入到等待隊列中。
工作原理:
數據庫連接池技術的優(yōu)點
1. 資源重用 由于數據庫連接得以重用,避免了頻繁創(chuàng)建,釋放連接引起的大量性能開銷。在減少系統消耗的基礎上,另一 方面也增加了系統運行環(huán)境的平穩(wěn)性。
2. 更快的系統反應速度 數據庫連接池在初始化過程中,往往已經創(chuàng)建了若干數據庫連接置于連接池中備用。此時連接的初始化工作均 已完成。對于業(yè)務請求處理而言,直接利用現有可用連接,避免了數據庫連接初始化和釋放過程的時間開銷, 從而減少了系統的響應時間
3. 新的資源分配手段 對于多應用共享同一數據庫的系統而言,可在應用層通過數據庫連接池的配置,實現某一應用最大可用數據庫 連接數的限制,避免某一應用獨占所有的數據庫資源
4. 統一的連接管理,避免數據庫連接泄漏 在較為完善的數據庫連接池實現中,可根據預先的占用超時設定,強制回收被占用連接,從而避免了常規(guī)數據 庫連接操作中可能出現的資源泄露
多種開源的數據庫連接池
JDBC 的數據庫連接池使用 javax.sql.DataSource 來表示,DataSource 只是一個接口,該接口通常由服務器(Weblogic, WebSphere, Tomcat)提供實現,也有一些開源組織提供實現:
DBCP 是Apache提供的數據庫連接池。tomcat 服務器自帶dbcp數據庫連接池。速度相對c3p0較快,但因 自身存在BUG,Hibernate3已不再提供支持。
C3P0 是一個開源組織提供的一個數據庫連接池,速度相對較慢,穩(wěn)定性還可以。hibernate官方推薦使用
Proxool 是sourceforge下的一個開源項目數據庫連接池,有監(jiān)控連接池狀態(tài)的功能,穩(wěn)定性較c3p0差一 點
BoneCP 是一個開源組織提供的數據庫連接池,速度快
Druid 是阿里提供的數據庫連接池,據說是集DBCP 、C3P0 、Proxool 優(yōu)點于一身的數據庫連接池,但是 速度不確定是否有BoneCP快
DataSource 通常被稱為數據源,它包含連接池和連接池管理兩個部分,習慣上也經常把 DataSource 稱為連接 池
DataSource用來取代DriverManager來獲取Connection,獲取速度快,同時可以大幅度提高數據庫訪問速 度。 特別注意:數據源和數據庫連接不同,數據源無需創(chuàng)建多個,它是產生數據庫連接的工廠,因此整個應用只需要一個 數據源即可。
當數據庫訪問結束后,程序還是像以前一樣關閉數據庫連接:conn.close(); 但conn.close()并沒有關閉數 據庫的物理連接,它僅僅把數據庫連接釋放,歸還給了數據庫連接池。
Druid(德魯伊)數據庫連接池
Druid是阿里巴巴開源平臺上一個數據庫連接池實現,它結合了C3P0、DBCP、Proxool等DB池的優(yōu)點,同時加入了 日志監(jiān)控,可以很好的監(jiān)控DB池連接和SQL的執(zhí)行情況,可以說是針對監(jiān)控而生的DB連接池,可以說是目前最好的 連接池之一。
public class TestDruid { public static void main(String[] args) throws Exception { Properties pro = new Properties(); pro.load(TestDruid.class.getClassLoader().getResourceAsStream("druid.properties")); DataSource ds = DruidDataSourceFactory.createDataSource(pro); Connection conn = ds.getConnection(); System.out.println(conn); } }
url=jdbc:mysql://localhost:3306/test?rewriteBatchedStatements=true username=root password=123456 driverClassName=com.mysql.jdbc.Driver initialSize=10 maxActive=20 maxWait=1000 filters=wall
到此這篇關于淺談一下數據庫連接池Druid德魯伊的文章就介紹到這了,更多相關數據庫連接池Druid內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java中List、Set、Map的區(qū)別和實現方式示例代碼
這篇文章主要介紹了Java中List、Set、Map的區(qū)別和實現方式示例代碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-06-06淺談靜態(tài)變量、成員變量、局部變量三者的區(qū)別
下面小編就為大家?guī)硪黄獪\談靜態(tài)變量、成員變量、局部變量三者的區(qū)別。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-09-09基于java servlet過濾器和監(jiān)聽器(詳解)
下面小編就為大家?guī)硪黄趈ava servlet過濾器和監(jiān)聽器(詳解)。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10SpringBoot使用Logback進行日志記錄的代碼示例
在開發(fā)Web應用程序時,日志記錄是非常重要的一部分,在SpringBoot中,我們可以使用Logback進行日志記錄,Logback是一款高性能、靈活的日志框架,它可以滿足各種不同的日志需求,在本文中,我們介紹了如何在SpringBoot中使用Logback進行日志記錄2023-06-06