`

C3P0 连接分析

    博客分类:
  • Java
阅读更多
最近在看C3P0的原理,还是将C3P0的源码导入到Ecplise中debug看得清楚多了。下面记录我debug的经历。

1. 下载c3p0的jar和源码,这个百度吧。
2. 导入jar和源码到java工程中,导入后,会发现有些错误的,把junit的类去掉,有的提示没有实现一些方法,就加进去,还有的提示要删除多余的实现方法,就删除掉吧,这样下来,基本上不报错了。
3. debug的过程中,有些类没有源码的,到google上去搜,会有源码的,写一个对应的java类加进工程里去就行了。

1. 写一个连接池的简单的工具类

public class ConnectionPool {
	private static ComboPooledDataSource ds;
	public synchronized static final Connection getConnection() {
		try {
			if (ds != null) {
				return ds.getConnection();
			}
			else{
				ds = new ComboPooledDataSource(true);
				ds.setJdbcUrl("jdbc:mysql://192.168.1.102:3306/S10");
				try {
					ds.setDriverClass("com.mysql.jdbc.Driver");
				} catch (PropertyVetoException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				ds.setUser("root");
				ds.setPassword("123456");
				ds.setInitialPoolSize(10);
				ds.setMinPoolSize(10);
				ds.setMaxPoolSize(20);
				ds.setMaxIdleTime(30);
				
				return ds.getConnection();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}
}



2. 现在需要debug的代码是
ds.getConnection()
,看看它的执行顺序吧。

首先进入的是AbstractPoolBackedDataSource中的getConnection方法
pc = getPoolManager().getPool().checkoutPooledConnection();
return pc.getConnection();


其中:getPoolManager().getPool()是获取连接池,它对应的类是C3P0PooledConnectionPoolManager,它管理着连接池的生命周期。

C3P0PooledConnectionPoolManager中有一个内部类PooledConnectionResourcePoolManager,它里面会创建BasicResourcePool,BasicResourcePool才是真正创建连接的地方。

会调用里面的私有方法。

 private void _recheckResizePool()
    {
        assert Thread.holdsLock(this);

        if (! broken)
        {
            int msz = managed.size();

            int shrink_count;
            int expand_count;

            if ((shrink_count = msz - pending_removes - target_pool_size) > 0)
                shrinkPool( shrink_count );
            else if ((expand_count = target_pool_size - (msz + pending_acquires)) > 0)
                expandPool( expand_count );
        }
    }


继续跟踪expandPool()方法,这里的expand_count 是初始值10.

 private void expandPool(int count)
    {
        assert Thread.holdsLock(this);

        // XXX: temporary switch -- assuming no problems appear, we'll get rid of AcquireTask
        //      in favor of ScatteredAcquireTask
        if ( USE_SCATTERED_ACQUIRE_TASK )
        {
            for (int i = 0; i < count; ++i)
                taskRunner.postRunnable( new ScatteredAcquireTask() );
        }
        else
        {
            for (int i = 0; i < count; ++i)
                taskRunner.postRunnable( new AcquireTask() );
        }
    }


进入到AcquireTask()方法里看到如下的代码。

  BasicResourcePool.this.doAcquire();

 Object resc = mgr.acquireResource();



acquireResource()方法会调用一个内部类PooledConnectionResourcePoolManager,它会调用下面的代码。

 if ( connectionCustomizer == null)
                    {
                        out = (auth.equals( C3P0ImplUtils.NULL_AUTH ) ?
                               cpds.getPooledConnection() :
                               cpds.getPooledConnection( auth.getUser(), 
                                                         auth.getPassword() ) );
                    }


上面的代码调用下面的代码

protected PooledConnection getPooledConnection(String user, String password, ConnectionCustomizer cc, String pdsIdt)
	throws SQLException
    { 
        // 它里面包含jdbcUrl等信息
	DataSource nds = getNestedDataSource();
	if (nds == null)
	    throw new SQLException( "No standard DataSource has been set beneath this wrapper! [ nestedDataSource == null ]");
        // 这里的代码调用是在DriverManagerDataSource中实现的
	Connection conn = nds.getConnection(user, password);
	if (conn == null)
	    throw new SQLException("An (unpooled) DataSource returned null from its getConnection() method! " +
				   "DataSource: " + getNestedDataSource());
	if ( this.isUsesTraditionalReflectiveProxies() )
	    {
		//return new C3P0PooledConnection( new com.mchange.v2.c3p0.test.CloseReportingConnection( conn ), 
		return new C3P0PooledConnection( conn,
						 connectionTester,
						 this.isAutoCommitOnClose(), 
						 this.isForceIgnoreUnresolvedTransactions(),
						 cc,
						 pdsIdt);
	    }
	else
	    {
		return new NewPooledConnection( conn, 
						connectionTester,
						this.isAutoCommitOnClose(), 
						this.isForceIgnoreUnresolvedTransactions(),
						this.getPreferredTestQuery(),
						cc,
						pdsIdt); 
	    }
    }


  public Connection getConnection(String username, String password) throws SQLException
    { 
        ensureDriverLoaded();
        // 这才是真实的物理连接啊
        Connection out = driver().connect( jdbcUrl, overrideProps(username, password) );  
        if (out == null)
            throw new SQLException("Apparently, jdbc URL '" + jdbcUrl + "' is not valid for the underlying " +
                            "driver [" + driver() + "].");
        return out;
    }


至此,初始化的10个连接完成了。
分享到:
评论

相关推荐

    c3p0-demo:原始文件详解系列(五)------ C3P0的使用和分析(包括JNDI)

    本文将包含以下内容(因为篇幅范围,可根据需要选择阅读): c3p0的使用方法(入门案例, JDNI使用) c3p0的配置参数详解c3p0主要源码分析使用示例-入门需求使用C3P0连接池获取连接对象,对用户数据进行简单的增删改...

    DBCP连接池原理分析

    超越(或相当)了c3p0.建议使用DBCP1.4或1.3 + commons pool 1.6 Tomcat7 中保留DBCP连接池,以兼容已有应用。并提供了新的Tomcat JDBC pool作为DBCP的可选替代。新出的Tomcat JDBC pool,据说比DBCP 1.4要好,未...

    Spring+ibatIS案例项目

    Spring+IbatIS项目,在案例项目中不只是对CURD的操作,主要是在配置文件中介绍了怎么配置链接迟,这个项目使用的是C3P0连接池,相应的还有.txt文件分析。部署到eclipse或者是myeclipse中修改jdbc.properties文件就...

    jsp+servlet+javabean+jdbc+mysql实现增删改查和分页功能

    客户管理案例 1.目的:总结JDBC,和Servlet JSP结合到一起。 2.开发中的一些小技巧。 3.客户管理平台功能 * 添加客户 * 查询所有的客户的信息 * 修改客户信息 ... * c3p0连接池 * c3p0-0.9.1.2.jar

    阿里巴巴的开源项目JDBC连接池、监控组件 Druid.zip

     2) 替换DBCP和C3P0。Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。 3) 数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。DruidDruiver和DruidDataSource都支持...

    Druid是一个JDBC组件,它包括三部分 高效可管理的数据库连接池.rar

    2) 替换DBCP和C3P0。Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。 3) 数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。DruidDruiver和DruidDataSource都支持...

    SpringBoot整合Druid应用的方法详解.docx

    结合了 C3P0、DBCP 等 DB 池的优点,同时加入了日志监控。Druid 是一个分布式的、支持实时多维 OLAP 分析的数据处理系统。它既支持高速的数据实时摄入处理,也支持实时且灵活的多维数据分析查询。 Druid已经在阿里...

    基于JavaWeb数据分析的关键词分析系统源码+项目使用说明.zip

    3) servlet、c3p0连接池、MySQL数据库的应用 4) TextRank4Keyword 自然语言处理关键词提取 5) ThreadPool 线程池 6) jsonp 爬虫 7) Mail IMAP协议 8)pdfbox PDF2String 9)poi 生成...

    基于springmvc高并发秒杀系统

    代码设计风格基于RESTful,以c3p0作为连接池,Redis数据库为媒介实现高并发技术。其中,对于相关的DAO,Service操作,均添加了Junit单元测试实例。 开发文档 一、业务分析 1.秒杀系统业务流程 2.秒杀业务的核心...

    druid-0.2.9.jar

    2) 替换DBCP和C3P0。Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。 3) 数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。DruidDruiver和DruidDataSource都支持...

    Druid jar 阿里数据库

    2) 替换DBCP和C3P0。Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。 3) 数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。DruidDruiver和DruidDataSource都支持...

    基于jsp+servlet+mysql三层架构实现的网上书店系统源码+项目说明.zip

    采用的主要技术栈是: jsp + servlet + Mysql,其中包括 jsp 的三大组件,c3p0 连接池,等技术,运用的开发环境时 Idea9 + Mysql8.0。 ## 二、相关技术: [1、三层架构设计思想]...

    MyEclipse_9创建SSH2开发环境必须的独立包

    c3p0-0.9.1.jar 是一个数据库连接池,Hibernate可以配置为使用C3PO连接池。如果准备用这个连接池,就需要这个jar包. dom4j-1.6.1.jar 用来读写XML文件的 ehcache-1.5.0.jar ehcache缓存 hibernate3.jar hibernate-...

    三位数字电容表说明书

    1 0 X 1 1 0 0 0 0 0 0 0 0 0 消隐 1 0 X 1 1 0 1 0 0 0 0 0 0 0 消隐 1 0 X 1 1 1 0 0 0 0 0 0 0 0 消隐 1 0 X 1 1 1 1 0 0 0 0 0 0 0 消隐 0 0 X X X X X 锁存 锁存* 3.1.5 显示电路 显示电路主要共阴LED显示。到...

    2017最新大数据架构师精英课程

    28_qq消息通信-群聊-手动刷新好友列表-下线通知0 P+ D" ]/ f. q* O! d9 Z& L 29_qq消息通信-群聊-私聊消息' a3 S6 a2 d+ Y6 s( Z 30_qq消息通信-群聊-私聊消息2 31_虚拟机内存结构-反射 32_虚拟机内存结构-JVM-$ j; ...

    seckill:基于SpringMVC,Spring,MyBatis实现的秒杀系统

    代码设计风格基于RESTful,以c3p0作为连接池,Redis数据库为中介实现高并发技术。其中,有关的DAO,服务操作,均添加了Junit单元测试实例。 开发文档 一,业务分析 1.秒杀系统业务流程 2.秒杀业务的核心:库存的...

    sharding-jdbc-1.5.1:sharding-jdbc原始码解析

    分片JDBC-分片数据库和表的JDBC驱动程序 概述 分片JDBC是JDBC的扩展... 支持DBCP,C3P0,BoneCP,Druid。 理论上,任何数据库都支持。 支持MySQL,Oracle,SQLServer和PostgreSQL。 5.配置 Java配置 Spring命名空间 Y

    水溶戊聚糖分级纯化组分结构初步分析 (2005年)

    研究表明:P-WSPI1-S组分由木糖和阿拉伯糖两种糖组成,两者的摩尔比为0.98,相对分子质量为831030,其可能的结构为:D-吡喃木糖以β(1→4)连接为木聚糖主链,侧链为α-呋喃阿拉伯糖,D-吡喃木糖残基可在C-2、C3位...

    xmljava系统源码-servlet-jsp_news:基于原生servlet、jsp、jdbc实现的新闻系统,采用wangEditor富文

    c3p0连接池 集成开发环境:Idea 2019 web容器:Tomcat 9 需求分析 普通用户: 用户注册:用户进入注册页面,输入相关信息并点击注册,系统将账号信息存入数据库。 用户登录:用户输入用户名和密码,若账号存在则登录...

    单片机密码锁设计.doc

    单片机允许的振荡晶体可在 1.2~24MHz之间选择,一般为 11.0592MHz,电容 C2,C3的取值对振荡频率输出的稳定性、 大小及振荡电路起振速度有一定的影响, 可在20~100pF之间选择,典型值位 30pF (2)计算机每次开始...

Global site tag (gtag.js) - Google Analytics