C3P0代码分析

数据库连接池基础

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

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

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

 c3p0 统一概念

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

c3p0 行为

生成一个 connnection

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

·      成生一个 pooledconnection

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

 checkin connection

·      pooledconnection 脱离关系

·      关闭与这个 connection 相关的 resultset

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

·      checkin 所有缓存的 statement.

·      修改 pooledconnection 相关信息

 checkout connection  

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

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

 

omc c3p0 常用配置属性


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: 关闭所有 checkinconnection checkoutconnection, 池这个对象也不要了,全是新的 .

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值