JDBC--數(shù)據(jù)源DataSource(數(shù)據(jù)庫連接池)

數(shù)據(jù)庫鏈接的建立和關(guān)閉是極其耗費(fèi)系統(tǒng)資源的操作村生。通過DriverManager獲取的數(shù)據(jù)庫連接懦冰,一個數(shù)據(jù)庫連接對象均對應(yīng)一個物理數(shù)據(jù)庫連接黄绩,每次操作都打開一個物理連接,使用完后立即關(guān)閉連接其垄。頻繁的打開苛蒲、關(guān)閉連接將造成系統(tǒng)性能的低下。
對于共享資源的情況绿满,有一個通用版的設(shè)計模式:資源池臂外。用于解決資源的頻繁請求、釋放所造成的性能下降。為了解決數(shù)據(jù)庫連接的頻繁請求漏健、釋放嚎货,JDBC2.0引入了數(shù)據(jù)庫連接池技術(shù)。
數(shù)據(jù)庫連接池蔫浆,在系統(tǒng)啟動時殖属,就主動建立足夠的數(shù)據(jù)庫連接,并將這些連接組成一個連接池瓦盛。每次應(yīng)用程序請求數(shù)據(jù)庫連接時洗显,無須重新打開連接,而是從連接池中取出已有的鏈接使用原环,使用完畢后不再關(guān)閉數(shù)據(jù)庫連接挠唆,而是直接將連接歸還給連接池。

數(shù)據(jù)庫連接池是Connection對象的工廠扮念。數(shù)據(jù)庫連接池的常用參數(shù)如下:

  • 數(shù)據(jù)庫的初始連接池
  • 連接池的最大連接數(shù)
  • 連接池的最小連接池
  • 連接池每次增加的容量

JDBC的數(shù)據(jù)庫連接池使用javax.sql.DataSource來表示,DataSource只是一個接口碧库,該接口通常由商用服務(wù)器等提供實現(xiàn)柜与,也有一些開源組織提供實現(xiàn)(DBCP、C3P0)嵌灰。
DataSource通常被稱為數(shù)據(jù)源弄匕,它包含連接池和連接池管理兩個部分,但習(xí)慣上也經(jīng)常把DataSource稱為連接池沽瞭。

DataSource有三種類型的實現(xiàn):

  • 基本實現(xiàn)——生成標(biāo)準(zhǔn)Connection對象
  • 連接池實現(xiàn)——生成自動參與連接池的Connection 對象迁匠。此實現(xiàn)與中間層連接池管理器一起使用。
  • 分布式事務(wù)實現(xiàn)——生成一個Connection 對象驹溃,該對象可用于分布式事務(wù)城丧,并且?guī)缀跏冀K參與連接池。此實現(xiàn)與中間層事務(wù)管理器一起使用豌鹤,并且?guī)缀跏冀K與連接池管理器一起使用亡哄。DataSource對象的屬性在需要時可以修改。例如布疙,如果將數(shù)據(jù)源移動到另一個服務(wù)器蚊惯,則可更改與服務(wù)器相關(guān)的屬性。其優(yōu)點(diǎn)是灵临,因為可以更改數(shù)據(jù)源的屬性截型,所以任何訪問該數(shù)據(jù)源的代碼都無需更改。

在Spring與Hibernate儒溉、Mybatis等ORM框架的整合過程中宦焦,DataSource扮演著非常重要的角色。

DBCP數(shù)據(jù)源

開源系統(tǒng):common-pool。如果需要使用該連接池實現(xiàn)赶诊,則應(yīng)在系統(tǒng)中增加如下兩個jar文件笼平。

  • commons-dbcp.jar:連接池的實現(xiàn)
  • commons-pool.jar:連接池實現(xiàn)的依賴庫

Tomcat的連接池正是采用該連接池實現(xiàn)的。數(shù)據(jù)庫連接池既可以與應(yīng)用服務(wù)器整合使用舔痪,也可以由應(yīng)用程序獨(dú)立使用寓调。

//創(chuàng)建數(shù)據(jù)源對象
BasicDataSource ds = new BasicDataSource();
//設(shè)置連接池所需的驅(qū)動
ds.setDriverClassName("com.mysql.jdbc.Driver");
//設(shè)置鏈接數(shù)據(jù)庫的URL
ds.setUrl("jdbc:mysql://localhost:3306/javaee");
//設(shè)置連接數(shù)據(jù)庫的用戶名
ds.setUsername("root");
//設(shè)置連接數(shù)據(jù)庫的密碼
ds.setPassword("pass");
//設(shè)置連接池的初始連接數(shù)
ds.setInitialSize(5);
//設(shè)置連接池最多可有多少個活動連接數(shù)
ds.setMaxActive(20);
//設(shè)置連接池中最少有兩個空閑的鏈接
ds.setMinTdle(2);

數(shù)據(jù)源和數(shù)據(jù)庫連接不同,數(shù)據(jù)源無須創(chuàng)建多個锄码,它是產(chǎn)生數(shù)據(jù)庫連接的工廠夺英,因此整個應(yīng)用只需要一個數(shù)據(jù)源即可。建議把上面的ds設(shè)置成static成員變量滋捶,并且在應(yīng)用開始時立即初始化數(shù)據(jù)源對象痛悯,程序中所有需要獲取數(shù)據(jù)庫連接的地方直接訪問該ds對象。并獲取數(shù)據(jù)庫連接即可重窟。

// 通過數(shù)據(jù)源獲取數(shù)據(jù)庫連接
Connection conn = ds.getConnection();

當(dāng)數(shù)據(jù)庫訪問結(jié)束后载萌,關(guān)閉數(shù)據(jù)庫連接。

// 釋放數(shù)據(jù)庫連接
conn.close();

C3P0數(shù)據(jù)源

相比之下巡扇,c3p0 的數(shù)據(jù)源性能更勝一籌扭仁,Hibernate推薦使用該連接池。C3P0連接池不僅可以自動清理不使用的Connection厅翔,還可以自動清理Statement和ResultSet乖坠。

c3p0-0.9.1.2.jar

//創(chuàng)建連接池實例
ComboPooledDataSource ds = new ComboPooledDataSource();
//設(shè)置連接池連接數(shù)據(jù)庫所需的驅(qū)動
ds.setDriverClass("com.mysql.jdbc.Driver");
//設(shè)置鏈接數(shù)據(jù)庫的URL
ds.setJdbcUrl("jdbc:mysql://localhost:3306/javaee");
//設(shè)置連接數(shù)據(jù)庫的用戶名
ds.setUser("root");
//設(shè)置連接數(shù)據(jù)庫的密碼
ds.setPassword("pass");
//設(shè)置連接池的最大連接數(shù)
ds.setMaxPoolSize(40);
//設(shè)置連接池的最小連接數(shù)
ds.setMinPoolSize(2);
//設(shè)置連接池的初始連接數(shù)
ds.setInitialPoolSize(5);
//設(shè)置連接池的緩存Statement的最大數(shù)
ds.setMaxStatements(180);

一旦獲取了C3P0連接池之后,獲取數(shù)據(jù)庫連接:

Connection conn = ds.getConnection();
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末刀闷,一起剝皮案震驚了整個濱河市熊泵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌甸昏,老刑警劉巖顽分,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異施蜜,居然都是意外死亡怯邪,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門花墩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來悬秉,“玉大人,你說我怎么就攤上這事冰蘑『兔冢” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵祠肥,是天一觀的道長武氓。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么县恕? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任东羹,我火速辦了婚禮,結(jié)果婚禮上忠烛,老公的妹妹穿的比我還像新娘属提。我一直安慰自己,他們只是感情好美尸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布冤议。 她就那樣靜靜地躺著,像睡著了一般师坎。 火紅的嫁衣襯著肌膚如雪恕酸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天胯陋,我揣著相機(jī)與錄音蕊温,去河邊找鬼。 笑死遏乔,一個胖子當(dāng)著我的面吹牛义矛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播按灶,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼症革,長吁一口氣:“原來是場噩夢啊……” “哼筐咧!你這毒婦竟也來了鸯旁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤量蕊,失蹤者是張志新(化名)和其女友劉穎铺罢,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體残炮,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡韭赘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了势就。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泉瞻。...
    茶點(diǎn)故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖苞冯,靈堂內(nèi)的尸體忽然破棺而出袖牙,到底是詐尸還是另有隱情,我是刑警寧澤舅锄,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布鞭达,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏畴蹭。R本人自食惡果不足惜坦仍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望叨襟。 院中可真熱鬧繁扎,春花似錦、人聲如沸芹啥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽墓怀。三九已至汽纠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間傀履,已是汗流浹背虱朵。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留钓账,地道東北人碴犬。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像梆暮,于是被迫代替她去往敵國和親服协。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容