c3p0-数据库链接池原理

一直用c3p0好久了,但也没时间或没主动去研究过,直到最近频频在出现一些莫名其妙的问题,以为仍是有必要了解和研究一下。html

  • c3p0是什么

  c3p0的出现,是为了大大提升应用程序和数据库之间访问效率的。java

  它的特性:数据库

  1. 编码的简单易用
  2. 链接的复用
  3. 链接的管理

  说到c3p0,不得不说一下jdbc自己,c3p0愿意就是对数据库链接的管理,那么原有的概念仍是得清晰:DriverManager、Connection、StateMent、ResultMent。api

  jdbc:java database connective这套API,不用多说,是一套用于链接各式dbms或链接桥接器的api,两个层级:上层供应用方调用api,下层,定义了各个dbms的spi的api(具体文档见:这里)。session

  主要要提的是:datasource、DriverManager,想到哪儿写到哪儿,datasource是更高级一点的api,缘由在于相对对应用来讲更透明。oracle

  Connection:同dbms的逻辑连接,相似于session管理概念, SQL statements are executed and results are returned within the context of a connection.编码

  jdbc的概念就到这里,平时用得比较多。url

  • c3P0的概念

 

  c3p0的bean配置以下:spa

 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,该类结构以下:3d

 

 

以上类图都不是很彻底,不过大致能表达出类之间的原理:

一、bean:ComboPooledDataSource的父类:AbstractPoolBackedDataSource有一个poolmanager字段,存储着对pool管理器

二、获取ds.getConnection()连接对象时,内部使用getPoolManger()获取C3p0ConnectionPooledManager(mgr)对象,该manager管理着pool对象:C3P0PooledConnectionPool对象,mgr.getPool().checkoutPooledConnection()

三、自此该connection已经被获取到了

四、让咱们看看该connection的真实面目吧:

 ProxyConnection。

五、所以其实原理是:

  从pool里获取到的connection,是proxy包装的connection,而对connection的释放或者重用,是pool的管理责任:初始化池大小,维护池的大小(expand或shrink),管理unused、expired、checkout、checkin链接。

真正底层的链接是jdbc本身的链接,而c3p0的管理部分,基本上使用的是synchronized关键字,使用timerTask定时器工做。

相关文章
相关标签/搜索