这里有新鲜出炉的 Java 并发编程示例,程序狗速度看过来!
java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台(即 JavaEE(j2ee), JavaME(j2me), JavaSE(j2se))的总称。
这篇文章主要为大家详细介绍了 Java 数据库连接池之 c3p0 简介的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
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 配置如下:
- <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>
还有一些配置选项,后续详细说明。可见 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 定时器工作。
来源: http://www.phperz.com/article/17/1231/355650.html