淺談一下數(shù)據(jù)庫(kù)連接池Druid德魯伊
JDBC數(shù)據(jù)庫(kù)連接池的必要性
在使用開發(fā)基于數(shù)據(jù)庫(kù)的web程序時(shí),傳統(tǒng)的模式基本是按以下步驟
在主程序(如servlet、beans)中建立數(shù)據(jù)庫(kù)連接
進(jìn)行sql操作
斷開數(shù)據(jù)庫(kù)連接
這種模式開發(fā),存在的問題:
普通的JDBC數(shù)據(jù)庫(kù)連接使用 DriverManager 來(lái)獲取,每次向數(shù)據(jù)庫(kù)建立連接的時(shí)候都要將 Connection加載到內(nèi)存中,再驗(yàn)證用戶名和密碼(得花費(fèi)0.05s~1s的時(shí)間)。需要數(shù)據(jù)庫(kù)連接的時(shí)候,就向數(shù)據(jù)庫(kù)要求 一個(gè),執(zhí)行完成后再斷開連接。這樣的方式將會(huì)消耗大量的資源和時(shí)間。數(shù)據(jù)庫(kù)的連接資源并沒有得到很 好的重復(fù)利用。若同時(shí)有幾百人甚至幾千人在線,頻繁的進(jìn)行數(shù)據(jù)庫(kù)連接操作將占用很多的系統(tǒng)資源,嚴(yán) 重的甚至?xí)斐煞?wù)器的崩潰。
對(duì)于每一次數(shù)據(jù)庫(kù)連接,使用完后都得斷開。否則,如果程序出現(xiàn)異常而未能關(guān)閉,將會(huì)導(dǎo)致數(shù)據(jù)庫(kù)系統(tǒng) 中的內(nèi)存泄漏,最終將導(dǎo)致重啟數(shù)據(jù)庫(kù)。(回憶:何為Java的內(nèi)存泄漏?)
這種開發(fā)不能控制被創(chuàng)建的連接對(duì)象數(shù),系統(tǒng)資源會(huì)被毫無(wú)顧及的分配出去,如連接過多,也可能導(dǎo)致內(nèi) 存泄漏,服務(wù)器崩潰。
數(shù)據(jù)庫(kù)連接池技術(shù)
為解決傳統(tǒng)開發(fā)中的數(shù)據(jù)庫(kù)連接問題,可以采用數(shù)據(jù)庫(kù)連接池技術(shù)。 數(shù)據(jù)庫(kù)連接池的基本思想:就是為數(shù)據(jù)庫(kù)連接建立一個(gè)“緩沖池”。預(yù)先在緩沖池中放入一定數(shù)量的連接,當(dāng)需要 建立數(shù)據(jù)庫(kù)連接時(shí),只需從“緩沖池”中取出一個(gè),使用完畢之后再放回去。
數(shù)據(jù)庫(kù)連接池負(fù)責(zé)分配、管理和釋放數(shù)據(jù)庫(kù)連接,它允許應(yīng)用程序重復(fù)使用一個(gè)現(xiàn)有的數(shù)據(jù)庫(kù)連接,而不是重 新建立一個(gè)。
數(shù)據(jù)庫(kù)連接池在初始化時(shí)將創(chuàng)建一定數(shù)量的數(shù)據(jù)庫(kù)連接放到連接池中,這些數(shù)據(jù)庫(kù)連接的數(shù)量是由最小數(shù)據(jù)庫(kù) 連接數(shù)來(lái)設(shè)定的。無(wú)論這些數(shù)據(jù)庫(kù)連接是否被使用,連接池都將一直保證至少擁有這么多的連接數(shù)量。連接池 的最大數(shù)據(jù)庫(kù)連接數(shù)量限定了這個(gè)連接池能占有的最大連接數(shù),當(dāng)應(yīng)用程序向連接池請(qǐng)求的連接數(shù)超過最大連 接數(shù)量時(shí),這些請(qǐng)求將被加入到等待隊(duì)列中。

工作原理:

數(shù)據(jù)庫(kù)連接池技術(shù)的優(yōu)點(diǎn)
1. 資源重用 由于數(shù)據(jù)庫(kù)連接得以重用,避免了頻繁創(chuàng)建,釋放連接引起的大量性能開銷。在減少系統(tǒng)消耗的基礎(chǔ)上,另一 方面也增加了系統(tǒng)運(yùn)行環(huán)境的平穩(wěn)性。
2. 更快的系統(tǒng)反應(yīng)速度 數(shù)據(jù)庫(kù)連接池在初始化過程中,往往已經(jīng)創(chuàng)建了若干數(shù)據(jù)庫(kù)連接置于連接池中備用。此時(shí)連接的初始化工作均 已完成。對(duì)于業(yè)務(wù)請(qǐng)求處理而言,直接利用現(xiàn)有可用連接,避免了數(shù)據(jù)庫(kù)連接初始化和釋放過程的時(shí)間開銷, 從而減少了系統(tǒng)的響應(yīng)時(shí)間
3. 新的資源分配手段 對(duì)于多應(yīng)用共享同一數(shù)據(jù)庫(kù)的系統(tǒng)而言,可在應(yīng)用層通過數(shù)據(jù)庫(kù)連接池的配置,實(shí)現(xiàn)某一應(yīng)用最大可用數(shù)據(jù)庫(kù) 連接數(shù)的限制,避免某一應(yīng)用獨(dú)占所有的數(shù)據(jù)庫(kù)資源
4. 統(tǒng)一的連接管理,避免數(shù)據(jù)庫(kù)連接泄漏 在較為完善的數(shù)據(jù)庫(kù)連接池實(shí)現(xiàn)中,可根據(jù)預(yù)先的占用超時(shí)設(shè)定,強(qiáng)制回收被占用連接,從而避免了常規(guī)數(shù)據(jù) 庫(kù)連接操作中可能出現(xiàn)的資源泄露
多種開源的數(shù)據(jù)庫(kù)連接池
JDBC 的數(shù)據(jù)庫(kù)連接池使用 javax.sql.DataSource 來(lái)表示,DataSource 只是一個(gè)接口,該接口通常由服務(wù)器(Weblogic, WebSphere, Tomcat)提供實(shí)現(xiàn),也有一些開源組織提供實(shí)現(xiàn):
DBCP 是Apache提供的數(shù)據(jù)庫(kù)連接池。tomcat 服務(wù)器自帶dbcp數(shù)據(jù)庫(kù)連接池。速度相對(duì)c3p0較快,但因 自身存在BUG,Hibernate3已不再提供支持。
C3P0 是一個(gè)開源組織提供的一個(gè)數(shù)據(jù)庫(kù)連接池,速度相對(duì)較慢,穩(wěn)定性還可以。hibernate官方推薦使用
Proxool 是sourceforge下的一個(gè)開源項(xiàng)目數(shù)據(jù)庫(kù)連接池,有監(jiān)控連接池狀態(tài)的功能,穩(wěn)定性較c3p0差一 點(diǎn)
BoneCP 是一個(gè)開源組織提供的數(shù)據(jù)庫(kù)連接池,速度快
Druid 是阿里提供的數(shù)據(jù)庫(kù)連接池,據(jù)說(shuō)是集DBCP 、C3P0 、Proxool 優(yōu)點(diǎn)于一身的數(shù)據(jù)庫(kù)連接池,但是 速度不確定是否有BoneCP快
DataSource 通常被稱為數(shù)據(jù)源,它包含連接池和連接池管理兩個(gè)部分,習(xí)慣上也經(jīng)常把 DataSource 稱為連接 池
DataSource用來(lái)取代DriverManager來(lái)獲取Connection,獲取速度快,同時(shí)可以大幅度提高數(shù)據(jù)庫(kù)訪問速 度。 特別注意:數(shù)據(jù)源和數(shù)據(jù)庫(kù)連接不同,數(shù)據(jù)源無(wú)需創(chuàng)建多個(gè),它是產(chǎn)生數(shù)據(jù)庫(kù)連接的工廠,因此整個(gè)應(yīng)用只需要一個(gè) 數(shù)據(jù)源即可。
當(dāng)數(shù)據(jù)庫(kù)訪問結(jié)束后,程序還是像以前一樣關(guān)閉數(shù)據(jù)庫(kù)連接:conn.close(); 但conn.close()并沒有關(guān)閉數(shù) 據(jù)庫(kù)的物理連接,它僅僅把數(shù)據(jù)庫(kù)連接釋放,歸還給了數(shù)據(jù)庫(kù)連接池。
Druid(德魯伊)數(shù)據(jù)庫(kù)連接池
Druid是阿里巴巴開源平臺(tái)上一個(gè)數(shù)據(jù)庫(kù)連接池實(shí)現(xiàn),它結(jié)合了C3P0、DBCP、Proxool等DB池的優(yōu)點(diǎn),同時(shí)加入了 日志監(jiān)控,可以很好的監(jiān)控DB池連接和SQL的執(zhí)行情況,可以說(shuō)是針對(duì)監(jiān)控而生的DB連接池,可以說(shuō)是目前最好的 連接池之一。
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

到此這篇關(guān)于淺談一下數(shù)據(jù)庫(kù)連接池Druid德魯伊的文章就介紹到這了,更多相關(guān)數(shù)據(jù)庫(kù)連接池Druid內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java8 使用工廠方法supplyAsync創(chuàng)建CompletableFuture實(shí)例
這篇文章主要介紹了Java8 使用工廠方法supplyAsync創(chuàng)建CompletableFuture實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
關(guān)于JSqlparser使用攻略(高效的SQL解析工具)
這篇文章主要介紹了關(guān)于JSqlparser使用攻略(高效的SQL解析工具),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
Java創(chuàng)建數(shù)組的幾種方式總結(jié)
下面小編就為大家?guī)?lái)一篇Java創(chuàng)建數(shù)組的幾種方式總結(jié)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2016-10-10
IDEA創(chuàng)建SpringBoot的maven項(xiàng)目的方法步驟
這篇文章主要介紹了IDEA創(chuàng)建SpringBoot的maven項(xiàng)目的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
使用java代碼代替xml實(shí)現(xiàn)SSM教程
這篇文章主要介紹了使用java代碼代替xml實(shí)現(xiàn)SSM教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12

