c3p0是什么
c3p0的出現(xiàn),是為了大大提高應(yīng)用程序和數(shù)據(jù)庫(kù)之間訪問(wèn)效率的。
它的特性:
- 編碼的簡(jiǎn)單易用
- 連接的復(fù)用
- 連接的管理
說(shuō)到c3p0,不得不說(shuō)一下jdbc本身,c3p0愿意就是對(duì)數(shù)據(jù)庫(kù)連接的管理,那么原有的概念還是得清晰:DriverManager、Connection、StateMent、ResultMent。
jdbc:java database connective這套API,不用多說(shuō),是一套用于連接各式dbms或連接橋接器的api,兩個(gè)層級(jí):上層供應(yīng)用方調(diào)用api,下層,定義了各個(gè)dbms的spi的api(具體文檔見(jiàn):這里)。
主要要提的是:datasource、DriverManager,想到哪兒寫到哪兒,datasource是更高級(jí)一點(diǎn)的api,原因在于相對(duì)對(duì)應(yīng)用來(lái)說(shuō)更透明。
Connection:同dbms的邏輯鏈接,類似于session管理概念, SQL statements are executed and results are returned within the context of a connection.
jdbc的概念就到這里,平時(shí)用得比較多。
c3P0的配置
c3p0的bean配置如下:
1
2
3
4
5
6
7
8
9
10
|
< bean id = "dataSource" class = "com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method = "close" > < property name = "driverClass" value = "${jdbc.driverClassName}" /> < property name = "jdbcUrl" value = "${jdbc.url}" /> < property name = "user" value = "${jdbc.username}" /> < property name = "password" value = "${jdbc.password}" /> < property name = "checkoutTimeout" value = "30000" /> < property name = "maxPoolSize" value = "15" /> < property name = "idleConnectionTestPeriod" value = "180" /> < property name = "maxIdleTime" value = "180" /> </ bean > |
還有一些配置選項(xiàng),后續(xù)詳細(xì)說(shuō)明。可見(jiàn)c3p0的bean引用使用的是:ComboPooledDataSource,該類結(jié)構(gòu)如下:
以上類圖都不是很完全,不過(guò)大體能表達(dá)出類之間的原理:
1、bean:ComboPooledDataSource的父類:AbstractPoolBackedDataSource有一個(gè)poolmanager字段,存儲(chǔ)著對(duì)pool管理器
2、獲取ds.getConnection()鏈接對(duì)象時(shí),內(nèi)部使用getPoolManger()獲取C3p0ConnectionPooledManager(mgr)對(duì)象,該manager管理著pool對(duì)象:C3P0PooledConnectionPool對(duì)象,mgr.getPool().checkoutPooledConnection()
3、自此該connection已經(jīng)被獲取到了
4、讓我們看看該connection的真實(shí)面目吧:
ProxyConnection。
5、因此其實(shí)原理是:
從pool里獲取到的connection,是proxy包裝的connection,而對(duì)connection的釋放或者重用,是pool的管理責(zé)任:初始化池大小,維護(hù)池的大小(expand或shrink),管理unused、expired、checkout、checkin連接。
真正底層的連接是jdbc自己的連接,而c3p0的管理部分,基本上使用的是synchronized關(guān)鍵字,使用timerTask定時(shí)器工作。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。