c3p0-數據庫連接池原理


一直用c3p0很久了,但也沒時間或沒主動去研究過,直到最近頻頻在出現一些莫名其妙的問題,覺得還是有必要了解和研究一下。

  • c3p0是什么

  c3p0的出現,是為了大大提高應用程序和數據庫之間訪問效率的。

  它的特性:

  1. 編碼的簡單易用
  2. 連接的復用
  3. 連接的管理

  說到c3p0,不得不說一下jdbc本身,c3p0願意就是對數據庫連接的管理,那么原有的概念還是得清晰:DriverManager、Connection、StateMent、ResultMent。

  jdbc:java database connective這套API,不用多說,是一套用於連接各式dbms或連接橋接器的api,兩個層級:上層供應用方調用api,下層,定義了各個dbms的spi的api(具體文檔見:這里)。

  主要要提的是:datasource、DriverManager,想到哪兒寫到哪兒,datasource是更高級一點的api,原因在於相對對應用來說更透明。

  Connection:同dbms的邏輯鏈接,類似於session管理概念, SQL statements are executed and results are returned within the context of a connection.

  jdbc的概念就到這里,平時用得比較多。

  • c3P0的概念

 

  c3p0的bean配置如下:

 1 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
 2         <property name="driverClass" value="${jdbc.driverClassName}" />
 3         <property name="jdbcUrl" value="${jdbc.url}" />
 4         <property name="user" value="${jdbc.username}" />
 5         <property name="password" value="${jdbc.password}" />
 6         <property name="checkoutTimeout" value="30000" />
 7         <property name="maxPoolSize" value="15" />
 8         <property name="idleConnectionTestPeriod" value="180" />
 9         <property name="maxIdleTime" value="180" />
10     </bean>

還有一些配置選項,后續詳細說明。可見c3p0的bean引用使用的是:ComboPooledDataSource,該類結構如下:

 

 

以上類圖都不是很完全,不過大體能表達出類之間的原理:

1、bean:ComboPooledDataSource的父類:AbstractPoolBackedDataSource有一個poolmanager字段,存儲着對pool管理器

2、獲取ds.getConnection()鏈接對象時,內部使用getPoolManger()獲取C3p0ConnectionPooledManager(mgr)對象,該manager管理着pool對象:C3P0PooledConnectionPool對象,mgr.getPool().checkoutPooledConnection()

3、自此該connection已經被獲取到了

4、讓我們看看該connection的真實面目吧:

 ProxyConnection。

5、因此其實原理是:

  從pool里獲取到的connection,是proxy包裝的connection,而對connection的釋放或者重用,是pool的管理責任:初始化池大小,維護池的大小(expand或shrink),管理unused、expired、checkout、checkin連接。

真正底層的連接是jdbc自己的連接,而c3p0的管理部分,基本上使用的是synchronized關鍵字,使用timerTask定時器工作。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM