`
hypgr
  • 浏览: 277761 次
社区版块
存档分类
最新评论

C3P0 代码分析

阅读更多

数据库连接池基础

·     没有连接池的数据库连接方式指通过DriverManager和基本实现DataSource进行连接,但它相关连接的建立以及关闭是非常耗时的.

·     如果使用连接池,将有池来管理相关的数据库连接,减少对数据库连接操作.

·     连接池所做的操作,除了管理连接,还有就是对数据库jdbc api的封装,但jdbc api才是根本,外面做的都是包装,再花哨都是假的。

 c3p0统一概念

  checkout == 从池中取得可用的连接
   checkoutconnection == 
被使用的连接
   checkin  == 
把连接放回池中
   checkinconnection == 
没有被使用的连接
   
所有超时设置,相关的连接,是物理连接的关闭,而不是连接返回池中
   
管理的是pooledconnection,而不是物理的connection
   pooledconnectionsun针对连接池的接口,它本身包含connection,和这个connection相关的所有statement,result,一个checkoutconnection所作的所有数据库操作,都被pooledconnection所管理.
   statement
缓存,主要针对PreparedStatementCallableStatement,statment缓存主要相对一个connection来说的,不同connectionstatment不能通用

c3p0行为

生成一个connnection

·     当池中connection没有到达最大数,当有请求出现,将会产生connection.

·     成生一个pooledconnection

·     通过pooledconnection.getConnection()得到连接(得到连接是newProxyConnection,不是物理连接)

 checkin connection

·     pooledconnection脱离关系

·     关闭与这个connection相关的resultset

·     关闭所有没有缓冲的statement.

·     checkin所有缓存的statement.

·     修改pooledconnection相关信息

 checkout connection 

·     查看池中是否有没有使用的connection,有就返回

·     没有,如果没有达到最大数,就生成一个,或者就等待

 

omcc3p0常用配置属性


automaticTestTable


automaticTestTable
作为测试connection是否有效的表,如果表存在,但有记录,抛出错误,如果表不存在,则建立,并使用SELECT * FROM automaticTestTable 作为连接测试语句

如果automaticTestTable没有设置,而preferredTestQuery设置,则使用preferredTestQuery作为连接测试语句

checkoutTimeout

从池中拿未使用的连接,超时设置,如果没有设置,就不超时.

numConnections

表明池中有多少个连接

numIdleConnections

表明池中有多少个空闲连接,它们可以被checkout

numBusyConnections

表明池中有多少个被checkout的连接,记住:numIdleConnections + numBusyConnections == numConnections

numUnclosedOrphanedConnections

都是checkoutconnection,但他们已经不再池中管理了.当他们checkin时候,将被destory

 

connectionCustomizerClassName


hook
方法,在对相关资源做操作的时候,''他所操作的connection是真实的数据库连接,而不是proxy过的connection''

 

maxIdleTime
checkout一个connection时候,判断这个connection没有被使用的时间是否大于maxIdleTime,来决定是关闭它,还是被checkout
maxConnectionAge

设置一个连接在池中最长的时间,如果时间超过,将会从池中清除

testConnectionOnCheckout
如果设置为true,每次从池中取一个连接,将做一下测试,使用automaticTestTable 或者 preferredTestQuery,做一条查询语句.看看连接好不好用,不好用,就关闭它,重新从池中拿一个.
unreturnedConnectionTimeout

一个checkout连接的超时设置,一旦一个checkout连接超时,他将物理的关闭,而不是返回池中,主要是防止连接被长期使用不释放,这个设置也是比较危险的
idleConnectionTestPeriod
设置在池中的没有被使用的连接,是否定时做测试,看看这个连接还可以用吗?
maxStatements,maxStatementsPerConnection
缓存statement,一个全局的,一个是针对每一个connection,个人觉得效果不是很大,而且也使用了反射机制
c3p0 jconsole说明

·          sampleThreadPoolStackTraces:打印出当前c3p0线程池的情况,默认是3个线程,c3p0很多行为异步,放到线程中做的,比如checkout,checkin,close操作,还有内部池重新整理

·          sampleThreadPoolStatus:打印出当前c3p0线程池堆栈

·          softResetDefaultUser:关闭所有checkinconnection,重新初始化池

·          hardReset:关闭所有checkinconnectioncheckoutconnection,池这个对象也不要了,全是新的.

·          close:关闭所有跟c3p0相关的东西

 

源代码分析

生成eclipse项目

·          sourceforge下载我们目前使用的0.9.1.2版本[http://nchc.dl.sourceforge.net/sourceforge/c3p0/c3p0-0.9.1.2.src.zip 下载]

·          ant codegen(因为它有很自动生成代码)

·          导入eclipse(source包括src/classes,build/codegen,缺少juit.jar,log4j.jar,自己解决)

相关概念

首先对datasource的理解,你可以把认为是factory,这样会好理解一点

·          PooledDataSource
  
默认情况情况下,PooledDataSource只管理一个连接池(getConnection()的时候),如果你使用getConnection(username,password),而不是默认的username,
 
将会再生产一个连接池针对这个特定的用户,它包含一个ConnectionPoolDataSource实现,连接就是从ConnectionPoolDataSource得到的.

·          ConnectionPoolDataSource
  
包名是javax.sql,一看就知道是sun定制的接口,表现出一个连接池,PooledConnection的工厂

·          PooledConnection
  
包名是javax.sql,也是sun定制的接口.c3p0默认的实现是NewPooledConnection

·          Connection,Statement,Result
  
操作数据库相关接口,在c3p0中对于NewProxyConnection,NewProxyStatement,NewProxyResultSet,这些东西统一被PooledConnection管理。

c3p0项目情况
c3p0
是现在用的最多连接池之一,这么成功的项目却只是一个人开发的。

当目标很明确(连接池要做什么,目标是非常明确的),使用场景很普通的时候,项目能成功,完全求决于程序的架构.

项目在jmx管理和本身死锁监测,做的都比较精彩,但也有它不足支持,jdk1.5提供了很多功能(比如多线程),它很多都是自己实现了,这就要看作者怎么对待这个项目

目前给我的感觉有点象当年的dom4j感觉,毕竟都需要谋生,创作激情会下降的.

分享到:
评论

相关推荐

    C3P0使用,C3P0源码及实例

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

    c3p0源码包

    源码包`c3p0-0.9.5.2.src`提供了c3p0的源代码,使得开发者可以深入理解其内部工作原理,进行定制化开发或调试。 ### c3p0基本概念 1. **数据库连接池**:在应用程序启动时预创建一定数量的数据库连接,并存储在一...

    C3P0 连接池源码

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

    c3p0 jar包和源码

    源码分析有助于理解 c3p0 的内部工作机制,例如: 1. **连接池的创建和管理**:`com.mchange.v2.c3p0.ComboPooledDataSource` 类是连接池的主要入口,负责初始化和管理连接池。 2. **连接的获取与释放**:`...

    c3p0jar包和源码

    **c3p0详解** c3p0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。在Java的Web应用开发中,数据库连接池是必不可少的部分,它可以有效地管理数据库连接,避免了频繁创建和...

    c3p0-0.9.5.2.bin源码及jar包

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

    c3p0-0.9.5.1 jar及源码

    C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定...了解和掌握C3P0的使用和源码分析,对于开发高效稳定的Java Web应用具有重要意义。通过深入研究,我们可以更好地优化数据库连接管理,提升系统的稳定性和性能。

    c3p0连接池源代码

    C3P0连接池是Java开发中常用的数据库连接...通过阅读和分析`c3p0-0.9.2.src`中的源代码,开发者可以了解到C3P0如何实现上述功能,以及如何针对具体应用场景进行定制和优化,这对于提升开发能力和解决实际问题大有裨益。

    C3P0连接池jar包(正式).zip

    3. **初始化C3P0**:在代码中创建` ComboPooledDataSource `对象,并加载配置,或者在Spring等框架中通过XML或注解方式配置C3P0数据源。 4. **获取与释放连接**:使用`getConnection()`方法从数据源获取连接,使用...

    c3p0-0.9.1.2.bin-src.rar

    四、c3p0源码解析 c3p0-0.9.1.2.src.zip提供了c3p0的源代码,这对于开发者来说是一个很好的学习资源。通过阅读源码,我们可以了解到c3p0内部的工作机制,如连接的创建、分配、回收等过程,以及各种策略的实现细节,...

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

    7. **源码分析**:提供的`xxx-sources.jar`文件使得开发者可以查看源代码,更深入地理解和学习其内部实现。 在使用C3P0时,首先需要添加对应的依赖库,如`mchange-commons-java-0.2.11.jar`和`c3p0-0.9.5.2.jar`。`...

    c3p0包

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

    C3P0jar包.rar

    Mchange Commons Java库包含了C3P0所需的通用工具类和数据结构,例如配置解析、日志记录等。这个库的更新通常会与C3P0主库同步,以确保兼容性和稳定性。 在使用C3P0时,开发者需要在项目中引入这两个JAR文件,并...

    c3p0需要的三个包

    2. **配置C3P0**:在配置文件(通常是`c3p0.properties`或应用程序的初始化代码中)设置连接池的参数,如初始连接数、最大连接数、超时时间等。 3. **获取和释放连接**:在应用程序中,通过C3P0提供的API(如`...

    java hibernate c3p0

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

    C3P0连接池jar包.zip

    - `mchange-commons-java-0.2.12.jar`:这是C3P0连接池依赖的基础工具库,包含了C3P0所需的一些通用功能,比如数据源管理、配置解析等。 - `c3p0-0.9.5.2.jar`:这是C3P0连接池的主要实现库,包含了所有C3P0的核心...

    c3p0数据源连接池的配置

    本文将深入解析如何在Java Web项目中配置与使用C3P0数据源连接池。 ### 一、C3P0简介 C3P0(Concurrent Data Source Pooling for Java)是一款开源的JDBC连接池实现,它提供了对JDBC资源进行统一管理的能力,通过...

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

    - `c3p0-0.9.5.2-sources.jar`:这个文件包含了C3P0的源代码,对于开发者来说,查看源码可以帮助理解和调试问题。 3. **配置文件**: `c3p0-config.xml`是C3P0的配置文件,定义了连接池的参数和行为。例如,你...

    c3p0连接池工具

    在Java代码中配置c3p0连接池: ```java ComboPooledDataSource cpds = new ComboPooledDataSource(); cpds.setDriverClass("com.mysql.jdbc.Driver"); cpds.setJdbcUrl("jdbc:mysql://localhost:3306/mydb"); ...

    c3p0-0.9.5.5打包.rar

    下面我们将详细解析这三个JAR文件及其在c3p0连接池中的作用。 1. **mchange-commons-java-0.2.19.jar**: 这个JAR文件包含了mchange-commons项目的基础工具类,为c3p0提供了一些通用的功能支持。其中包括异常处理...

Global site tag (gtag.js) - Google Analytics