- 浏览: 52912 次
文章分类
最新评论
最近在看C3P0的原理,还是将C3P0的源码导入到Ecplise中debug看得清楚多了。下面记录我debug的经历。
1. 下载c3p0的jar和源码,这个百度吧。
2. 导入jar和源码到java工程中,导入后,会发现有些错误的,把junit的类去掉,有的提示没有实现一些方法,就加进去,还有的提示要删除多余的实现方法,就删除掉吧,这样下来,基本上不报错了。
3. debug的过程中,有些类没有源码的,到google上去搜,会有源码的,写一个对应的java类加进工程里去就行了。
1. 写一个连接池的简单的工具类
2. 现在需要debug的代码是
首先进入的是AbstractPoolBackedDataSource中的getConnection方法
其中:getPoolManager().getPool()是获取连接池,它对应的类是C3P0PooledConnectionPoolManager,它管理着连接池的生命周期。
C3P0PooledConnectionPoolManager中有一个内部类PooledConnectionResourcePoolManager,它里面会创建BasicResourcePool,BasicResourcePool才是真正创建连接的地方。
会调用里面的私有方法。
继续跟踪expandPool()方法,这里的expand_count 是初始值10.
进入到AcquireTask()方法里看到如下的代码。
acquireResource()方法会调用一个内部类PooledConnectionResourcePoolManager,它会调用下面的代码。
上面的代码调用下面的代码
至此,初始化的10个连接完成了。
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个连接完成了。
发表评论
-
Java IO 读文件的各种方法总结
2016-01-01 15:00 697IO分为字节流和字符流,字符就是简单的字符串存储,从理伦上讲, ... -
动态代理的应用
2015-12-22 17:30 732代理模式作为开发人员 ... -
Java Restful
2015-12-19 14:01 440对于两个系统之间交互信息,有两种常见的方式:webservic ... -
request.getInputStream() 只能读一次的解决方法
2015-12-17 12:17 2377我们知道request.getInputStream()只能读 ... -
java Hessian 版本冲突问题解决方法
2015-12-11 19:44 865今天在实际的项目发现了一个问题就是hessian的版本不兼容的 ... -
ThreadPoolExecutor参数讲解
2015-12-10 08:14 8171. 线程池可以节省创建多个线程带来的开销问题。 2. 线程 ... -
Java RSA 加密 解密 签名 验签
2015-12-09 10:01 61471. 加密的作用 1)明文变密文(你不知道密钥是很难解密的) ... -
Java Xstream xml 与bean之间的转换
2015-12-09 08:31 745xml文件如下: <mvc> & ... -
XPATH 解析XML
2015-12-09 08:28 4341. 表达式描述 nodename 选取此节点的所有子节 ... -
Java Dom4j 解析XML
2015-12-09 08:23 365Dom4j和JDom是很相似的,用起来十分方便。 XML文件 ... -
Java JDom 解析xml
2015-12-09 08:22 415JDOM在解析XML在代码量之上比之前的方法(DOM和SAX要 ... -
Java SAX 解析xml
2015-12-08 18:13 419在上一篇中http://gaofulai1988.iteye. ... -
Java XML解析系列
2015-12-08 18:00 752Java解析XML有多种方式,因此需要分为几个不同的系列来讲。 ... -
Java 背包算法计算从数组中找若干个数使其最接近某个数
2015-12-08 17:38 1988背包的算法的动态方式如下: f(i,w) = max{ f(i ... -
微信开发的原理
2015-11-30 10:10 1318微信在现在的生活中,扮演着举足轻重的角色,现在怎么东西都在微信 ... -
JAVA Timestamp 与Data的转化以及BigDecimal 保留两位小数
2015-11-27 14:47 17001. BigDecimal 保留两位小数 今天在项目中遇到这 ... -
java try catch finally return 继续
2015-11-27 13:45 402之前在博客中有一篇文章讨论过异常中return值的情况,有兴趣 ... -
Java JDBC executeBatch 批量操作
2015-11-27 08:05 1630对JDBC 的 CRUD操作,我相信对于每个开发人员来讲,是十 ... -
Java WeakHashMap 分析
2015-11-26 08:17 620昨天在我们的系统中看 ... -
加密与解密
2015-11-18 18:12 481我本身不是学密码出身的,但在工作中经常要使用加密与解密的东东, ...
相关推荐
6. **性能监控**:C3P0提供了一些内置的统计信息和日志功能,帮助开发者监控连接池的运行状态,分析和优化性能。 在使用C3P0时,我们需要做以下几步配置: 1. **添加依赖**:将"C3P0连接池jar包(正式)"导入到项目类...
通过源码分析,我们可以了解C3P0在连接获取、释放和空闲连接管理等方面的性能优化策略,如预热连接(pretest connections)以减少首次使用时的延迟,以及连接池的大小调整等。 7. **源码中的核心类** - `...
**c3p0连接池工具详解** c3p0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。c3p0的主要功能是管理数据库连接,提高数据库访问效率,避免因为频繁创建和销毁数据库连接而造成...
C3P0连接池是Java开发中常用的数据库连接池组件,它由Miquel Piera创建并维护,是一个开源的项目。源代码分析对于理解其内部工作原理、优化使用方式以及进行二次开发具有重要意义。本文件`c3p0-0.9.2.src`包含了C3P0...
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。这个压缩包包含了使用C3P0连接池所需的全部组件,包括mchange-commons-java库和C3P0的核心库。以下是关于C3P0连接池及其...
本篇文章将深入探讨两种流行的数据库连接池——c3p0和HikariCP,以及它们在数据库操作中的应用。 c3p0是较早出现的开源数据库连接池实现,它提供了一个灵活且功能丰富的解决方案。c3p0的核心特性包括: 1. **连接...
C3P0是一个开源的Java数据库连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。这个压缩包包含了C3P0的0.9.5.2版本,以及相关的依赖库。下面将详细介绍C3P0的功能、工作原理以及如何使用。 C3P0...
- **源码分析**:如果需要查看或修改源码,可以解压`c3p0-0.9.1.2.src.zip`,了解其内部实现细节。 - **配置文件**:通常在项目的`WEB-INF/classes`目录下创建`c3p0.properties`或在`applicationContext.xml`等...
C3P0的源码分析可以帮助开发者深入理解其内部工作机制,包括连接的创建、检测、回收以及异常处理等。源码中的关键类有`ComboPooledDataSource`(数据源)、`PoolableConnectionFactory`(连接工厂)和`...
5. 监控和调整:C3P0提供了丰富的监控功能,可以通过JMX(Java Management Extensions)进行实时监控,也可以通过配置文件设定定时报告,以便于分析和优化连接池的性能。 C3P0相比其他数据库连接池,如DBCP、...
c3p0提供了完善的连接池管理和监控功能,如自动检测失效的连接并回收,支持连接测试。它具有较小的内存占用,适用于小型项目。配置相对简单,但相比其他连接池,其性能稍弱。 2. **DBCP**:Apache Commons DBCP是...
通过分析源代码,我们可以了解到C3P0是如何实现连接池管理、异常处理、资源回收等功能的,这对于优化数据库性能和排查问题非常有帮助。同时,对于开发者来说,学习C3P0源码也能提升对JDBC和数据库连接池原理的理解。
MySQL数据库服务器下C3P0连接池的配置 本文主要讲述了在MySQL数据库服务器下使用C3P0连接池的配置,解决了连接池的问题,并提供了详细的解决方案。 一、概述 在开发项目时,笔者遇到了一些问题,即Tomcat服务器...
**c3p0连接池**是Java Web开发中常用的一款开源数据库连接池组件,它能够有效地管理和优化数据库连接,提高应用程序的性能。源码包`c3p0-0.9.5.2.src`提供了c3p0的源代码,使得开发者可以深入理解其内部工作原理,...
**c3p0** 是一个开源的 JDBC 连接池,它实现了数据源和 JNDI 绑定,支持 JDBC3 规范和 JDBC2 的标准扩展。在 Java 应用开发中,数据库连接池是必不可少的部分,它可以有效地管理数据库连接,提高应用程序的性能和...
6. **源代码分析**:`c3p0-0.9.1.2.src`可能包含了C3P0的源代码,这对于我们理解其内部机制、定制功能或排查问题非常有帮助。源代码通常包含各个类和接口的定义,以及它们之间的交互逻辑。 7. **优化建议**:为了...
C3P0连接池是一种基于Java的开源数据库连接池实现,它被广泛应用于各种Java应用程序,尤其是知名的ORM框架如Hibernate和IoC容器如Spring中。C3P0库提供了高效且可靠的数据库连接管理,帮助开发者优化数据库访问性能...
5. **源码分析**:深入源码层面,理解C3P0如何处理数据库连接的创建、分配和释放,以及其与Hibernate的交互过程。 6. **异常处理**:探讨C3P0在遇到数据库连接问题时的错误处理机制,如连接泄漏、超时等问题的排查...
通过合理的配置c3p0和log4j,开发者可以优化数据库访问性能,同时方便地追踪和分析应用运行时的错误与调试信息,这对于开发、测试和生产环境都是非常重要的。在实际项目中,应根据应用的规模、并发量以及性能需求,...
相比c3p0,Druid提供了更丰富的监控和扩展功能,如SQL解析、性能分析、健康检查等。如果你选择使用Druid,配置文件中的设置会有所不同,例如,你需要指定数据源类型为Druid,并配置相应的Druid连接池参数。 在集成...