1 概述
c3p0是一个数据库连接池中间件。官网在此:https://www.mchange.com/projects/c3p0/。
最近因旧项目在c3p0的使用上出现些问题,所以特访问c3p0官网一探究竟。遇到英文,翻译到此处,以备后查。水平有限,
仅供参考。仅翻译大意,未按中文语序重排。
2 术语
这里对该文章中的特定英文词汇做解释说明。
client:相对于数据库而言,使用JDBC、数据库链接的软件和程序即为 client。我译作 客户端。
check in:以c3p0数据库连接池的视角看,check in 是从 客户端client 手里收回 数据库链接。
check out:以c3p0数据库连接池的视角看,check out 是客户端client 从 c3p0 连接池里租借 数据库链接。
broken clinet application:个人推测是 不能更改、不可控的客户端程序。
3 译文
Configuring Connection Testing 数据库连接测试的配置
c3p0可以配置用来测试数据库连接,那些通过多种方式,被加入连接池的数据库链接,来最小化你的应用看到断开的或者“腐坏的”数据库链接的可能性。
池化的数据库链接可能应为多种原因变坏,这些原因包括:某些JDBC驱动故意将持续很长时间的数据库连接池设置为超时;后端的数据库或者网络有时会断开很久不用的池化的数据库链接;数据库链接很容易随着时间和使用而变得腐坏,因为资源泄露,JDBC驱动有BUG,或者其它原因。
c3p0为用户在测试数据库链接时提供了很多的灵活性,通过下面这几个配置参数:
- automaticTestTable
- connectionTesterClassName
- idleConnectionTestPeriod
- preferredTestQuery
- testConnectionOnCheckin
- testConnectionOnCheckout
idleConnectionTestPeriod,
testConnectionOnCheckout,
testConnectionOnCheckin
此三个参数控制着 什么时候 数据库链接会被测试。而
automaticTestTable,
connectionTesterClassName,
preferredTestQuery
则控制这 他们如何被测试 。
当配置测试时,首先要最小化每次测试的开销。假如你使用的是支持jdbc4 API的JDBC驱动,并且你使用的是 c3p0的0.9.5版本或者更高版本,那么你的驱动就能替你完成这项工作。jdbc4链接包含了一个叫 isValid() 的方法,这个方法按约定会实现一个快速可靠的数据库链接测试。通常,如果驱动中有isValid() 方法,c3p0就会使用该方法。
反之,你的驱动不支持新的 API,c3p0的默认做法是 调用 和数据库链接关联的 DatabaseMetaData 对象的 getTables() 方法来测试数据库链接。这种方法的优点是健壮性好,并且和数据库的scehma无关,支持任何数据库。但是 调用 DatabaseMetaData.getTables() 通常比一条普通的 数据库查询慢,用这个测试方法可能很明显的降低数据库连接池的性能。
当你使用一个JDBC3 驱动器(或者 0.9.5版本之前的c3p0),提高测试效率最简单的的方法就是,使用带有 preferredTestQuery 参数的查询。但是,请注意,设置 preferredTestQuery 参数可能会产生错误,
<待续>
Configuring to Debug and Workaround Broken Client Applications 如何调试和替换不可控的客户端应用
有时客户端(相对于数据库而言,调用JDBC的程序即为客户端)在使用数据库链接时 粗心大意,没有关闭它们。最后导致连接池增长到 maxPoolSize,链接被耗尽。
解决这类问题的最好方法是修复客户端。c3p0可以辅助你调试,通过告知你那些被客户端租借走的链接是在哪里被不小心未回收的。在很少或者很倒霉的情况下,客户端的开发工作被终止了,即使里面有BUG,你也无法修复。c3p0可以帮你在不可控的程序外围处理它,阻止它耗尽资源池。
下面的参数可帮你debug或者替代损坏的客户端程序
unreturnedConnectionTimeout 设定的是数据库链接可以被使用的时间上限(单位为秒)。如果设置为非0值,已经被客户端租借使用但未被回收,且已经租借超过 unreturnedConnectionTimeout 设定值的数据库链接,将会被立刻销毁(断开?),随后被归还给连接池。显然,你必须小心设置此参数值,要确保这个值足够大,可以保证使用这些数据库链接的操作有足够时间完成任务。你可以把这个参数只用来处理那些不可靠的没有关闭数据库链接的客户端程序。
比在外围调试更好的就是直接上手修改代码了。除了可以设置 unreturnedConnectionTimeout ,你还可以设置 debugUnreturnedConnectionStackTraces 为 true。一旦设置,c3p0会捕获每个数据库链接被客户端租借时的堆栈信息。无论何时,只要有一个未归还的数据库链接超时,堆栈信息就会被打印出来,迅速显示出租的链接是在何处超时未被收回的。debugUnreturnedConnectionStackTraces 参数仅适用调试,因为捕获堆栈信息会减慢数据库链接的租借效率。
<小结 完>
原创翻译,转载请注明出处。