1.c3p0是什么?
c3p0是一个库。它扩展了传统的jdbc数据库连接池,并且支持JDBC3规范和JDBC2的标准扩展。
2.为什么使用c3p0?
首先,c3p0是一种jdbc数据库连接池。那么为什么使用数据库连接池呢?因为数据库连接是一种关键的、有限的、昂贵的资源。传统的模式(如传统的java web项目中,servlet的beans中建立数据库连接),每次连接都需要验证用户,消耗了大量的时间和资源。而数据库连接池在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已经建立的空闲连接对象。使用完毕后,用户不关闭连接,而是将数据库连接对象放回连接池中。数据库连接池管理数据连接的建立、断开,同时监视数据库连接数量和使用情况。使用数据库连接池会显著提高整个应用程序的伸缩性(大大提高了连接数量)和健壮性(能够应对大量用户频繁连接数据库,减少系统资源的消耗),提高应用程序的性能指标。
3.java web项目中部署c3p0(MyEclipse)
---------------------?
作者:飞天小女警777?
来源:CSDN?
原文:https://blog.csdn.net/u014402683/article/details/74935581?
版权声明:本文为博主原创文章,转载请附上博文链接!
?
?
转自https://www.cnblogs.com/leeying/p/3745588.html
c3p0是什么
c3p0的出现,是为了大大提高应用程序和数据库之间访问效率的。
它的特性:
编码的简单易用连接的复用连接的管理
说到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定时器工作。