c3p0
2016-06-27 14:04:59 0 举报
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和ODBC3规范。使用C3P0可以减少资源的消耗,提高数据库访问的效率。 C3P0具有以下特点: - 提供强大的监控和故障恢复能力; - 支持多种数据库,如MySQL、Oracle等; - 可以通过配置文件进行灵活的配置; - 可以自动管理数据库连接池中的连接数。 使用C3P0可以提高应用程序的性能和稳定性,减少数据库连接的资源消耗。在实际应用中,我们可以通过配置C3P0来实现对数据库连接池的管理和使用。
作者其他创作
大纲/内容
C3P0PooledConnectionPool
RemoveTask
shouldExpire(resc)
ResourcePool rp;ConnectionEventListener clGooGooStatementCache scache;int checkoutTimeout;AsynchronousRunner sharedTaskRunner;AsynchronousRunner deferredStatementDestroyer;;ThrowableHolderPool thp = new ThrowableHolderPool();InUseLockFetcher inUseLockFetcher;
checkoutPooledConnectioncheckinPooledConnection
createThreadResources
expandPool
在这里创建了ThreadPoolAsynchronousRunner
ResourcePool.Manager
+ attribute1:type = defaultValue+ attribute2:type- attribute3:type
+ operation1(params):returnType- operation2(params)- operation3()
assimilateResource(NewPooledConnection)
waitMarkPooledConnectionInUse这个方法会等待他底下的所有statems都为空了才把他加入到在使用的connection里
通过反射的方式活取propNamesToReadMethods
Referenceable
1.1.3
ThreadPoolAsynchronousRunner
ThreadPerTaskAsynchronousRunner在DeadlockDetector中出现,构造函数中创建了主timer 作为时间调度 和deadlockChecker 这么一个timerTask时间任务,主要跑的是checkForDeadlock方法
PooledDataSource
getAllUsershardResetclose
recheckResourcePool()
注册一个以com.mchange.v2.c3p0:type=C3P0Registry 为ObjectName key 的存放 C3P0RegistryManager()的
_recheckResizePool
taskRunner.postRunnable(
1.1.1.1.2C3P0Registry.reregister( this );
BasicResourcePoolFactory。createPool
C3P0PooledConnectionPool的内部类
prelimCheckoutResource
PooledConnectionResourcePoolManager
创建了managed avalable pendingTasks把所有的管理的线程都停用放入stoppedThreadsToStopDates
C3P0PooledConnectionPoolManager连接池
ThreadPoolAsynchronousRunner taskRunner;ThreadPoolAsynchronousRunner deferredStatementDestroyer;Timer timer; ResourcePoolFactory rpfact;Map authsToPools;ConnectionPoolDataSource cpds;Map propNamesToReadMethods;Map flatPropertyOverrides;Map userOverrides;DbAuth defaultAuth;String parentDataSourceIdentityToken;String parentDataSourceName;
poolsInitgetPool
PoolBackedDataSourceBase
identityTokenPropertyChangeSupport pcs VetoableChangeSupport vcs ConnectionPoolDataSource connectionPoolDataSourceString dataSourceName
1.1.1.1.1this.identityToken = C3P0ImplUtils.allocateIdentityToken( this );
PooledConnectionResourcePoolManager.acquireResource()
referenceProperties(HashSet).add
ThreadPoolAsynchronousRunner.recreateThreadsAndTasks
1.1.1super()
实现接口
BasciResourcePool.this.doAcquireAndDecrementPendingAcquiresWithinLockOnSuccess()
ensureStartResources暴增初始化线程达到要求
BasicResourcePool
BasicResourcePoolFactory factory; AsynchronousRunner taskRunner; RunnableQueue asyncEventQueue; ResourcePoolEventSupport rpes; Timer cullAndIdleRefurbishTimer; TimerTask cullTask; TimerTask idleRefurbishTask;HashSet acquireWaiters HashSet otherWaiters HashMap managed LinkedList unused HashSet excludedMap formerResourcesSet idleCheckResources ResourcePool.Manager mgr
AbstractPoolBackedDataSource.getPoolManager
AbstractComboPooledDataSource
DriverManagerDataSource dmds;//对jdbc连接方式的封装WrapperConnectionPoolDataSource wcpds;//连接池
ComboPooledDataSource
ReplacedThreadInterruptor 是ThreadPoolAsynchronousRunner的内部类 他的run方法回去调用processReplacedThreads方法这个线程每隔一段时间去扫描stoppedThreadsToStopDates,如果线程停掉了就移出 ,如果超出指定时间还没停掉 强制interrupt,然后移出,如果stoppedThreadsToStopDates集合空了的话就停止自身 cancel
C3P0PooledConnectionPoolManager对线程进行管理
AbstractPoolBackedDataSource
C3P0PooledConnectionPoolManagerpoolManager
getPoolManager
acquire
assertCpds()通过AbstractPoolBackedDataSource.getConnectionPoolDataSource获取connectionPoolDataSource
1.1.1.1.0触发了PoolBackedDataSourceBase的一些内部变量的初始化
_recheckResizePool 控制线程数
punchcard 是这样用的last_check_in_time归还时间checkout_time借出时间
http://blog.csdn.net/u012345283/article/details/49393407
连接池大管家,负责连接池的生命周期,并且提供一系列生命周期需要的生态环境1. 定时检测任务AdminTaskTimer 2. 全局的线程池
BasicResourcePoolFactory
new TImer()
ResourcePool child = new BasicResourcePool(
getPool().
ComboPooledDataSource.getConnection
new C3P0PooledConnectionPool
1.1.2
ResourcePool
ResourcePool的实现类,抽象了一个“资源池”。刚才说到C3P0PooledConnectionPoolManager是管理连接池的生命周期的,那么BasicResourcePool就是管理池中连接的生命周期的。值得注意的是,BasicResourcePool并不是一个人在战斗,它还有一个小伙伴——BasicResourcePool.Manager来协助它一起管理池中的连接。
AbstractIdentityTokenized
equals(根据getIdentityToken来判断是不是同一对象)
添加连接删除过期连接
把连接放入到managed unused 里重新领取一个punchcard
BasicResouce
getStatementCacheNumDeferredCloseThreads
WrapperConnectionPoolDataSource
DataSource nestedDataSource;
getPooledConnection
1.0创建 referencemaker=new JavaBeanReferenceMaker
GooGooStatementCache在创建C3P0PooledConnectionPool 时候调用
taskRunner.postRunnable(new ScatteredAcquireTask())
taskRunner.postRunnable( new ScatteredAcquireTask() );//增加ScatteredAcquireTask
new DeadlockDetector();
doAcquire()
removeResurce
shrinkPool
this.scache = new GlobalMaxOnlyStatementCache(
GooGooStatementCache
资源的释放
从basicResourcePool中取连接
createConnectionStatementManagerSimpleConnectionStatementManager
getConnection
setUpPropertyEvents()
synchronousRemoveArbitraryResource
ScatteredAcquireTask负责扩展
IncautiousStatementDestructionManager
checkoutAndMarkConnectionInUse
assimilateResource
addReferenceProperty
1.3.1C3p0PooledConnectionPoolManager.poolsInit()
createPooledConnectionPool
AbstractPoolBackedDataSource()
IdentityTokenResolvable
readResolvedoResolve(IdentityTokenized )根据idput到c3p0Registry中的idtCoalescer对象中 这个对象是以map为核心存储对象的 并返回对象
notifyAll()唤醒等待的线程 比如getConnection的时候做的await
1.1初始化ComboPooledDataSource
1.1.1.1super()
1.1.1.1.2.2 AbstractWekCoalescer.java
PooledConnection pc = getPoolManager().getPool().checkoutPooledConnection();
1.new ComboPooledDataSource
checkoutPooledConnection();
获得经过关闭的NewPooledConnection
cullExpired
new C3poTest
AbstractComboPooledDataSource(true)
添加删除任务destroyresourcetask
1.1.1.1.2.1 attemptRegisterRegistryMBean();
C3P0PoolConnectionPool:物理连接池对应的类,自身逻辑并不复杂,主要是通过委托给其代理的ResourcePool来实现“池”的逻辑
GlobalMaxOnlyStatementCache
ScatteredAcquireTask
recreateThreadsAndTasksThreadPerTaskAsynchronousRunner
IdentityTokenized
0 条评论
回复 删除
下一页