c3p0源码分析v1
版本:0.9.1.2
数据源
入口类: ComboPooledDataSource
getConnection方法在AbstractPoolBackedDataSource类中实现。
获取连接
触发机制:
应用主动调用。
调用过程:
1、AbstractPoolBackedDataSource类getConnection方法
public Connection getConnection()
throws SQLException
{
PooledConnection pc = getPoolManager().getPool ().checkoutPooledConnection();
return pc.getConnection();
}
接是newProxyConnection,不是物理连接得到连。
说明:
l PooledConnection
包名是javax.sql,是sun针对连接池的接口,它本身包含connection,和这个connection相关的所有statement,result,一个checkout的connection
所做的所有数据库操作,都被pooledconnection所管理。
c3p0默认的实现是NewPooledConnection
l Connection,Statement,Result
操作数据库相关接口,在c3p0中对应于NewProxyConnection,NewProxyStatement,NewProxyResultSet,这些东西统一被PooledConnection管理。
2、C3P0PooledConnectionPool类
public PooledConnection checkoutPooledConnection()
return ((PooledConnection)this.rp.checkoutResource(this.checkoutTimeout));
3、 BasicResourcePool类
public Object checkoutResource(long timeout)
1) 关键步骤代码:Object resc = prelimCheckoutResource(timeout);
查看池中是否有未使用的connection,有就返回(还要判断是否空闲、是否过期);没有,如果没有达到最大数,就生成一个,或者就等待。
2) 关键步骤代码:
boolean refurb = attemptRefurbishResourceOnCheckout (resc);
得到连接后,检测连接的可用性。
3) 连接可用,接着判断连接是否处于管理中,不在就再调用本方法获取一个,在就返回本连接。
添加连接
触发机制:
获取连接时,BasicResourcePool类prelimCheckoutResource方法调用。
调用过程:
1、 BasicResourcePool类prelimCheckoutResource方法当可用连接数为0时调用recheckResizePool方法。
2、 _recheckResizePool方法判断需要扩容则调用expandPool方法
3、 expandPool方法使用线程池调用AcquireTask(实现Runnable接口)任务进行扩容。
4、 AcquireTask调用mgr.acquireResource[55] 方法获取连接,如果连接池里的连接未到最大数量将获取的连接加入管理和未使用的list中,否则销毁连接。
关闭(回收)连接
触发机制:
应用程序调用连接的close方法。
调用过程:
1、C3P0PooledConnectionPool类里的ConnectionEventListenerImpl监听器类的connectionClosed方法被触发。
2、判断同步还是异步(默认是同步)。异步就采用线程池来处理回收,同步就直接调用BasicResourcePool类的checkinResource方法对连接进行回收,注意是回收不是关闭物理连接。
死锁
C3p0很多操作都是多线程来处理的(如:添加连接,回收连接等),所以进行必要的死锁检测。
由ThreadPoolAsynchronousRunner类的子类DeadlockDetector来执行具体的操作。
DeadlockDetector类继承了TimerTask,由Timer来调度DeadlockDetecto运行。
DeadlockDetector类有2个属性:
LinkedList last = null;
LinkedList current = null;
这2个list放的是待执行的任务,根据属性名就知道last是上次检测时待执行的任务,current是这次检测时要执行的任务,当pendingTasks(当前要执行的任务,克隆给current)不为空且current.equals( last )时认为死锁发生。
死锁发生后,当前任务交给ThreadPerTaskAsynchronousRunner类来处理,这个类会启用新的线程DispatchThread来处理当前的任务队列。
小结
c3p0是现在用的比较广泛的连接池之一,获取连接的效率有待提高,使用jdk1.6之前的可以考虑,jdk1.6及以后的建议使用BoneCP。
从连接池获取的连接,用完了都要关闭,不用怕会关闭物理连接造成无法回收,因为从连接池拿到的连接都是代理的,所以放心调用close方法。
相关推荐
源码包`c3p0-0.9.5.2.src`提供了c3p0的源代码,使得开发者可以深入理解其内部工作原理,进行定制化开发或调试。 ### c3p0基本概念 1. **数据库连接池**:在应用程序启动时预创建一定数量的数据库连接,并存储在一...
四、c3p0源码解析 c3p0-0.9.1.2.src.zip提供了c3p0的源代码,这对于开发者来说是一个很好的学习资源。通过阅读源码,我们可以了解到c3p0内部的工作机制,如连接的创建、分配、回收等过程,以及各种策略的实现细节,...
2. `c3p0-0.9.5.2-sources.jar`:这是一个源码文件包,包含了C3P0的源代码。对于开发者来说,能够查看源代码有助于理解和调试C3P0的工作原理,也可以方便地对其进行定制或扩展。 3. `mchange-commons-java-0.2.12....
本文将深入解析C3P0的源码,帮助读者理解其内部机制和工作原理。 C3P0的核心功能包括: 1. **连接创建与管理**:C3P0会预先创建一定数量的数据库连接,并将它们保存在连接池中。当应用程序需要连接时,可以从池中...
在这个"**c3p0、druid的jar包.zip**"压缩文件中,包含了这两个库的源码,方便开发者深入理解和定制。 首先,C3P0是一个开源的JDBC连接池,由Mchange公司提供。它的主要功能包括: 1. **连接池管理**:C3P0能创建并...
这个源码压缩包是C3P0的0.9.1.2版本,属于一个较老的发行版。下面将详细探讨C3P0的核心功能、工作原理以及其在数据库连接池中的作用。 一、C3P0概述 1. 定位:C3P0是一个JDBC连接池实现,主要目标是提供一个健壮、...
《c3p0数据库连接池源码解析与应用实践》 c3p0是一个开源的JDBC连接池,它的版本号0.9.1.2代表着这个特定的源码包。该压缩包“c3p0-0.9.1.2.src.zip”包含了c3p0的源代码,使得开发者可以深入理解其内部机制,学习...
标题 "c3p0+log4j+jdom" 涉及到三个主要的Java库:C3P0,Log4j和JDOM。这些工具在IT领域中扮演着重要的角色,尤其在Java应用程序开发中。 C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和...
5. **配置解析**:C3P0 如何读取和解析配置文件,以及如何根据配置动态调整连接池参数。 6. **API 设计**:了解 C3P0 提供的公共 API,学习如何在应用程序中正确使用和配置 C3P0 连接池。 7. **性能优化**:通过...
这个压缩包文件"SSM - SpringMVC4 + Spring4 + mybatis3 + c3p0 + Mysql.rar"包含了构建基于SSM的教育平台项目所需的全部组件,其中涉及了Spring MVC作为控制器、Spring负责业务逻辑和依赖注入,MyBatis处理数据库...
这个资料包中的`druid-1.0.9`和`C3P0`文件可能包含了这两个连接池的库文件,以及相关的配置示例,对于学习者来说,可以通过阅读源码和实践配置,深入了解它们的内部实现和使用方法。在实际项目中,结合提供的配置...
在深入学习时,可以通过阅读源码理解c3p0如何管理数据库连接,以及mchange-commons-java如何提供各种实用工具,同时,你还可以学习到如何将这些组件集成到自己的Java应用中,以提升数据库操作的效率和系统的稳定性。
本篇文章将对比分析四个常见的Java连接池实现:C3P0、Proxool、Druid和Tomcat JDBC Pool,以帮助开发者选择最适合项目需求的解决方案。 1. C3P0 C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3...
标题中的“Swing+Spring-3.1.1+Mybatis-3.1.1+C3p0-0.9.1.2+Sqlite 实现Swing版网络爬虫”是一个集成开发项目,它利用了一系列Java技术来构建一个基于Swing的网络爬虫应用程序。这个项目的核心组件包括: 1. **...
《深入剖析Hibernate 5.2.16.Final源码:结合c3p0与dom4j的实战解析》 Hibernate作为Java领域中备受推崇的对象关系映射(ORM)框架,极大地简化了数据库操作,使得开发者可以专注于业务逻辑而不是繁琐的数据访问层...
本教程将围绕"Maven搭建SpringMVC项目源码"这一主题,详细介绍如何使用Maven构建一个基于SpringMVC的Web项目,并涉及到C3P0数据源的配置。 首先,让我们了解Maven。Maven是一个项目管理工具,它可以帮助我们管理...
分片JDBC-分片数据库和表的JDBC驱动程序 概述 分片JDBC是JDBC的扩展... 支持DBCP,C3P0,BoneCP,Druid。 理论上,任何数据库都支持。 支持MySQL,Oracle,SQLServer和PostgreSQL。 5.配置 Java配置 Spring命名空间 Y
### C3电枢异物吸引系统解析 #### 1. 系统概述 “C3电枢异物吸引”是指一种特定的应用场景下的控制程序。在这个场景中,PLC被用来控制一个装置或系统,以检测并移除电枢中的异物。电枢通常指的是电动机或发电机中...
首先,Spring支持多种数据源类型,包括Apache的DBCP、C3P0等第三方数据源,以及内置的SimpleDriverDataSource、SingleConnectionDataSource等。在实际应用中,最常用的可能是AbstractDataSource抽象类的实现,如...
9. **C3P0连接池**:Hibernate 3.6.1默认使用C3P0连接池管理数据库连接,源码中的`persistence/c3p0`模块包含了C3P0的相关配置。 10. **方言(Dialect)**:Hibernate支持多种数据库,`org.hibernate.dialect`包...