C3P0 配置连接测试

c3p0的连接测试可以用来最小化你的应用遇到失效或过时的连接的可能性,它可以用多种方式来进行配置。

池中的连接可能会因为各种原因而变得不可用——有些JDBC驱动有意地对长连接设置了超时参数;后端的数据库或网络有时候会宕掉;有些连接仅仅是因为资源紧缺,驱动的漏洞或者其他原因而变得不可用。

c3p0通过以下参数为用户提供了灵活的测试连接的方法:
[list]
[]automaticTestTable
[
]connectionTesterClassName
[]idleConnectionTestPeriod
[
]preferredTestQuery
[]testConnectionOnCheckin
[
]testConnectionOnChechout
[/list]

idleConnetionTestPeriod, testConnectionOnCheckout和testConnectionOnCheckin决定了连接何时被测试。automaticTestTable, connectionTesterClassName和preferredTestQuery决定了连接怎样被测试。

当配置连接测试的时候,首先应该考虑如何减少测试的开支。默认情况下,连接通过在与其关联的DatabaseMetaData对象上调用getTables()方法来进行测试。这对所有数据库来讲都有效,因为这与数据库的视图(database schema)无关。然而,从经验上来讲,调用DatabaseMetaData.getTables()方法相对于进行一个简单的数据库查询要慢多了。

提高连接测试速度的最方便的方法就是定义automaticTestTable属性。c3p0将会使用你提供的名字创建一个空的表,然后通过一个简单的查询来测试数据库。你也可以通过设定preferredTestQuery参数来定义一个测试语句。不过你得当心点,设置preferredTestQuery将会导致在初始化数据源之前出现错误,如果你查询的目标表不存在的话。

高级用户可以实现一个ConnectionTester然后提供一个类的全限定名作为connectionTesterClassName属性来实现任何想要的连接测试。如果你想要使你的ConnectionTester能够支持preferredTestQuery和automaticTestTable属性,实现UnifiedConnectionTester接口即可,实现AbstractConnectionTester是最方便的。更多信息见API文档。

检测连接最可靠的时间就是从池中取出连接的时候(check-out)。但从客户端性能的角度来看,是这也是开销最大的。大多数应用将idleConnectionTestPeriod和testConnectionOnCheckIn结合起来用就已经非常可靠了。空闲测试和将连接放回池时(check-in)的测试都是异步执行的,这就是为什么它们有更好的性能的原因。

注意,对有些应用程序来说,拥有高性能远比避免偶然发生的数据库异常更重要。默认情况下,c3p0不会做任何连接测试。设置一个非常长的idleConnectionTestPeriod值和避免check-out与check-out测试是很不错的,高性能的方法。

REF:http://cwiki.ossez.com/pages/viewpage.action?pageId=4719819