`

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连接池jar包(正式).zip

    6. **性能监控**:C3P0提供了一些内置的统计信息和日志功能,帮助开发者监控连接池的运行状态,分析和优化性能。 在使用C3P0时,我们需要做以下几步配置: 1. **添加依赖**:将"C3P0连接池jar包(正式)"导入到项目类...

    C3P0 连接池源码

    通过源码分析,我们可以了解C3P0在连接获取、释放和空闲连接管理等方面的性能优化策略,如预热连接(pretest connections)以减少首次使用时的延迟,以及连接池的大小调整等。 7. **源码中的核心类** - `...

    c3p0连接池工具

    **c3p0连接池工具详解** c3p0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。c3p0的主要功能是管理数据库连接,提高数据库访问效率,避免因为频繁创建和销毁数据库连接而造成...

    c3p0连接池源代码

    C3P0连接池是Java开发中常用的数据库连接池组件,它由Miquel Piera创建并维护,是一个开源的项目。源代码分析对于理解其内部工作原理、优化使用方式以及进行二次开发具有重要意义。本文件`c3p0-0.9.2.src`包含了C3P0...

    C3P0连接池jar包(完整版).rar

    C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。这个压缩包包含了使用C3P0连接池所需的全部组件,包括mchange-commons-java库和C3P0的核心库。以下是关于C3P0连接池及其...

    c3p0和HikariCP连接池对数据库操作

    本篇文章将深入探讨两种流行的数据库连接池——c3p0和HikariCP,以及它们在数据库操作中的应用。 c3p0是较早出现的开源数据库连接池实现,它提供了一个灵活且功能丰富的解决方案。c3p0的核心特性包括: 1. **连接...

    c3p0数据库连接池架包及源码

    C3P0是一个开源的Java数据库连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。这个压缩包包含了C3P0的0.9.5.2版本,以及相关的依赖库。下面将详细介绍C3P0的功能、工作原理以及如何使用。 C3P0...

    c3p0连接池

    - **源码分析**:如果需要查看或修改源码,可以解压`c3p0-0.9.1.2.src.zip`,了解其内部实现细节。 - **配置文件**:通常在项目的`WEB-INF/classes`目录下创建`c3p0.properties`或在`applicationContext.xml`等...

    C3P0使用,C3P0源码及实例

    C3P0的源码分析可以帮助开发者深入理解其内部工作机制,包括连接的创建、检测、回收以及异常处理等。源码中的关键类有`ComboPooledDataSource`(数据源)、`PoolableConnectionFactory`(连接工厂)和`...

    c3p0数据源jar包.zip

    5. 监控和调整:C3P0提供了丰富的监控功能,可以通过JMX(Java Management Extensions)进行实时监控,也可以通过配置文件设定定时报告,以便于分析和优化连接池的性能。 C3P0相比其他数据库连接池,如DBCP、...

    数据库连接池资源包(c3p0 , dbcp,druid连接池)

    c3p0提供了完善的连接池管理和监控功能,如自动检测失效的连接并回收,支持连接测试。它具有较小的内存占用,适用于小型项目。配置相对简单,但相比其他连接池,其性能稍弱。 2. **DBCP**:Apache Commons DBCP是...

    c3p0-0.9.5.2.bin源码及jar包

    通过分析源代码,我们可以了解到C3P0是如何实现连接池管理、异常处理、资源回收等功能的,这对于优化数据库性能和排查问题非常有帮助。同时,对于开发者来说,学习C3P0源码也能提升对JDBC和数据库连接池原理的理解。

    MySQL数据库服务器下C3P0连接池的配置.pdf

    MySQL数据库服务器下C3P0连接池的配置 本文主要讲述了在MySQL数据库服务器下使用C3P0连接池的配置,解决了连接池的问题,并提供了详细的解决方案。 一、概述 在开发项目时,笔者遇到了一些问题,即Tomcat服务器...

    c3p0源码包

    **c3p0连接池**是Java Web开发中常用的一款开源数据库连接池组件,它能够有效地管理和优化数据库连接,提高应用程序的性能。源码包`c3p0-0.9.5.2.src`提供了c3p0的源代码,使得开发者可以深入理解其内部工作原理,...

    c3p0 jar包和源码

    **c3p0** 是一个开源的 JDBC 连接池,它实现了数据源和 JNDI 绑定,支持 JDBC3 规范和 JDBC2 的标准扩展。在 Java 应用开发中,数据库连接池是必不可少的部分,它可以有效地管理数据库连接,提高应用程序的性能和...

    c3p0包

    6. **源代码分析**:`c3p0-0.9.1.2.src`可能包含了C3P0的源代码,这对于我们理解其内部机制、定制功能或排查问题非常有帮助。源代码通常包含各个类和接口的定义,以及它们之间的交互逻辑。 7. **优化建议**:为了...

    C3P0连接池.zip

    C3P0连接池是一种基于Java的开源数据库连接池实现,它被广泛应用于各种Java应用程序,尤其是知名的ORM框架如Hibernate和IoC容器如Spring中。C3P0库提供了高效且可靠的数据库连接管理,帮助开发者优化数据库访问性能...

    java hibernate c3p0

    5. **源码分析**:深入源码层面,理解C3P0如何处理数据库连接的创建、分配和释放,以及其与Hibernate的交互过程。 6. **异常处理**:探讨C3P0在遇到数据库连接问题时的错误处理机制,如连接泄漏、超时等问题的排查...

    c3p0&log4j配置文件及说明

    通过合理的配置c3p0和log4j,开发者可以优化数据库访问性能,同时方便地追踪和分析应用运行时的错误与调试信息,这对于开发、测试和生产环境都是非常重要的。在实际项目中,应根据应用的规模、并发量以及性能需求,...

    cas4.0 mysql c3p0 jar包

    相比c3p0,Druid提供了更丰富的监控和扩展功能,如SQL解析、性能分析、健康检查等。如果你选择使用Druid,配置文件中的设置会有所不同,例如,你需要指定数据源类型为Druid,并配置相应的Druid连接池参数。 在集成...

Global site tag (gtag.js) - Google Analytics