C3P0 配置数据库故障的修复

c3p0被设计成(并且默认开启了)可以从临时的数据库故障中恢复,比如数据库重启或者短暂地断开网络。你可以通过以下几个属性改变对c3p0在获取连接时遇到的错误的处理方式:
[list]
[]acquireRetryAttempts
[
]acquireRetryDelay
[*]breakAfterAcquireFailure
[/list]

当c3p0在尝试获取数据库连接失败时,会自动地重试acquireRetryAttempts次,每次间隔acquireRetryDelay。如果依然失败,所有在等待这些连接的客户端将会收到一个异常,用来表示不能获取连接。请注意,如果不是所有的获取连接尝试都失败,客户端并不会收到异常,这可能在初始化尝试获取连接之后还需要一点儿时间。如果acquireRetryAttempts被设置为0,c3p0将会无限期地尝试获取一个新的连接,对getConnection()的调用可能会无限阻塞下去,直到成功获取一个连接。

一旦所有的获取连接的尝试都失败,有两种可能的处理方式。默认情况下,c3p0数据源会保持活性,然后对后续的请求作出回应。如果你将breakAfterAcquireFailure设置为true的话,数据源将会在所有尝试失败后马上停止工作,并且后续的请求也会马上失败。

请注意,如果数据库重启了,一个连接池也许还维持着那些以前获取的而现在变得不可用的连接。默认情况下,这些陈旧的连接不会被马上发现并且清理掉,当一个应用程序使用它们的时候,会马上得到一个异常。设定maxIdleTime或者maxConnectionAge可以帮助你加速替换掉这些不可用的连接。
(见连接寿命的管理)如果你想完全避免应用程序因此遇到异常,你必须得指定一中连接测试策略用来在客户端使用不可用连接之前就清理掉它们。

(见连接测试的配置)即使使用积极的连接测试(testConnectionsOnCheckout设置为true, 或者testConnectionsOnCheckin为true并且设置了一个小的idleConnectionTestPeriod值),你的应用程序在数据库重启的时候依然有可能遇到一个相关的异常,比如数据库在你已经将连接测试成功后才重启。

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