C3P0 代码分析
數(shù)據(jù)庫連接池基礎(chǔ)
·?????沒有連接池的數(shù)據(jù)庫連接方式指通過DriverManager和基本實(shí)現(xiàn)DataSource進(jìn)行連接,但它相關(guān)連接的建立以及關(guān)閉是非常耗時(shí)的.
·?????如果使用連接池,將有池來管理相關(guān)的數(shù)據(jù)庫連接,減少對數(shù)據(jù)庫連接操作.
·?????連接池所做的操作,除了管理連接,還有就是對數(shù)據(jù)庫jdbc api的封裝,但jdbc api才是根本,外面做的都是包裝,再花哨都是假的。
?c3p0統(tǒng)一概念
? checkout ==?從池中取得可用的連接
?? checkoutconnection ==?被使用的連接
?? checkin? ==?把連接放回池中
?? checkinconnection ==?沒有被使用的連接
???所有超時(shí)設(shè)置,相關(guān)的連接,是物理連接的關(guān)閉,而不是連接返回池中
???管理的是pooledconnection,而不是物理的connection
?? pooledconnection是sun針對連接池的接口,它本身包含connection,和這個(gè)connection相關(guān)的所有statement,result,一個(gè)checkout的connection所作的所有數(shù)據(jù)庫操作,都被pooledconnection所管理.
?? statement緩存,主要針對PreparedStatement和CallableStatement,statment緩存主要相對一個(gè)connection來說的,不同connection的statment不能通用.?
c3p0行為
生成一個(gè)connnection
·?????當(dāng)池中connection沒有到達(dá)最大數(shù),當(dāng)有請求出現(xiàn),將會(huì)產(chǎn)生connection.
·?????成生一個(gè)pooledconnection
·?????通過pooledconnection.getConnection()得到連接(得到連接是newProxyConnection,不是物理連接)
?checkin connection
·?????與pooledconnection脫離關(guān)系
·?????關(guān)閉與這個(gè)connection相關(guān)的resultset
·?????關(guān)閉所有沒有緩沖的statement.
·?????checkin所有緩存的statement.
·?????修改pooledconnection相關(guān)信息
?checkout connection?
·?????查看池中是否有沒有使用的connection,有就返回
·?????沒有,如果沒有達(dá)到最大數(shù),就生成一個(gè),或者就等待
?
omc中c3p0常用配置屬性
automaticTestTable
automaticTestTable作為測試connection是否有效的表,如果表存在,但有記錄,拋出錯(cuò)誤,如果表不存在,則建立,并使用SELECT * FROM automaticTestTable?作為連接測試語句
如果automaticTestTable沒有設(shè)置,而preferredTestQuery設(shè)置,則使用preferredTestQuery作為連接測試語句
checkoutTimeout
從池中拿未使用的連接,超時(shí)設(shè)置,如果沒有設(shè)置,就不超時(shí).
numConnections
表明池中有多少個(gè)連接
numIdleConnections
表明池中有多少個(gè)空閑連接,它們可以被checkout
numBusyConnections
表明池中有多少個(gè)被checkout的連接,記住:numIdleConnections + numBusyConnections == numConnections
numUnclosedOrphanedConnections
都是checkoutconnection,但他們已經(jīng)不再池中管理了.當(dāng)他們checkin時(shí)候,將被destory
?
connectionCustomizerClassName
hook方法,在對相關(guān)資源做操作的時(shí)候,''他所操作的connection是真實(shí)的數(shù)據(jù)庫連接,而不是proxy過的connection''
?
maxIdleTime
在checkout一個(gè)connection時(shí)候,判斷這個(gè)connection沒有被使用的時(shí)間是否大于maxIdleTime,來決定是關(guān)閉它,還是被checkout
maxConnectionAge
設(shè)置一個(gè)連接在池中最長的時(shí)間,如果時(shí)間超過,將會(huì)從池中清除
testConnectionOnCheckout
如果設(shè)置為true,每次從池中取一個(gè)連接,將做一下測試,使用automaticTestTable?或者?preferredTestQuery,做一條查詢語句.看看連接好不好用,不好用,就關(guān)閉它,重新從池中拿一個(gè).
unreturnedConnectionTimeout
一個(gè)checkout連接的超時(shí)設(shè)置,一旦一個(gè)checkout連接超時(shí),他將物理的關(guān)閉,而不是返回池中,主要是防止連接被長期使用不釋放,這個(gè)設(shè)置也是比較危險(xiǎn)的
idleConnectionTestPeriod
設(shè)置在池中的沒有被使用的連接,是否定時(shí)做測試,看看這個(gè)連接還可以用嗎?
maxStatements,maxStatementsPerConnection
緩存statement,一個(gè)全局的,一個(gè)是針對每一個(gè)connection,個(gè)人覺得效果不是很大,而且也使用了反射機(jī)制.?
c3p0?jconsole說明
·??????????sampleThreadPoolStackTraces:打印出當(dāng)前c3p0線程池的情況,默認(rèn)是3個(gè)線程,c3p0很多行為異步,放到線程中做的,比如checkout,checkin,close操作,還有內(nèi)部池重新整理
·??????????sampleThreadPoolStatus:打印出當(dāng)前c3p0線程池堆棧
·??????????softResetDefaultUser:關(guān)閉所有checkinconnection,重新初始化池
·??????????hardReset:關(guān)閉所有checkinconnection和checkoutconnection,池這個(gè)對象也不要了,全是新的.
·??????????close:關(guān)閉所有跟c3p0相關(guān)的東西
?
源代碼分析
生成eclipse項(xiàng)目
·??????????從sourceforge下載我們目前使用的0.9.1.2版本[http://nchc.dl.sourceforge.net/sourceforge/c3p0/c3p0-0.9.1.2.src.zip?下載]
·??????????ant codegen(因?yàn)樗泻茏詣?dòng)生成代碼)
·??????????導(dǎo)入eclipse(source包括src/classes,build/codegen,缺少juit.jar,log4j.jar,自己解決)
相關(guān)概念
首先對datasource的理解,你可以把認(rèn)為是factory,這樣會(huì)好理解一點(diǎn)
·??????????PooledDataSource
??默認(rèn)情況情況下,PooledDataSource只管理一個(gè)連接池(getConnection()的時(shí)候),如果你使用getConnection(username,password),而不是默認(rèn)的username,
?將會(huì)再生產(chǎn)一個(gè)連接池針對這個(gè)特定的用戶,它包含一個(gè)ConnectionPoolDataSource實(shí)現(xiàn),連接就是從ConnectionPoolDataSource得到的.
·??????????ConnectionPoolDataSource
??包名是javax.sql,一看就知道是sun定制的接口,表現(xiàn)出一個(gè)連接池,是PooledConnection的工廠
·??????????PooledConnection
??包名是javax.sql,也是sun定制的接口.c3p0默認(rèn)的實(shí)現(xiàn)是NewPooledConnection
·??????????Connection,Statement,Result
??操作數(shù)據(jù)庫相關(guān)接口,在c3p0中對于NewProxyConnection,NewProxyStatement,NewProxyResultSet,這些東西統(tǒng)一被PooledConnection管理。
c3p0項(xiàng)目情況
c3p0是現(xiàn)在用的最多連接池之一,這么成功的項(xiàng)目卻只是一個(gè)人開發(fā)的。
當(dāng)目標(biāo)很明確(連接池要做什么,目標(biāo)是非常明確的),使用場景很普通的時(shí)候,項(xiàng)目能成功,完全求決于程序的架構(gòu).
項(xiàng)目在jmx管理和本身死鎖監(jiān)測,做的都比較精彩,但也有它不足支持,jdk1.5提供了很多功能(比如多線程),它很多都是自己實(shí)現(xiàn)了,這就要看作者怎么對待這個(gè)項(xiàng)目
目前給我的感覺有點(diǎn)象當(dāng)年的dom4j感覺,畢竟都需要謀生,創(chuàng)作激情會(huì)下降的.
?
轉(zhuǎn)載于:https://www.cnblogs.com/wangbin/archive/2009/11/08/1598351.html
總結(jié)
- 上一篇: note-删除Visual Studio
- 下一篇: TechEd China 2009 课程