连接池基本配置
initialPoolSize, minPoolSize, maxPoolSize定义了由池管理的连接数量。请确保minPoolSize<=maxPoolSize。不合理的initialPoolSize值将会被忽略,然后使用 minPoolSize来替代。
容量和连接寿命配置
maxIdleTime定义了连接因在多少秒内未被使用而被连接池剔除的时间。maxConnectionAge决定了所有从数据库中获取的连接将在多少秒后被连接池剔除。maxIdleTimeExcessConnections用来最小化 c3p0 欠载(under load)时的连接数。默认情况下,在 c3p0 欠载时,c3p0 只会因连接测试失败或者连接过期而缩小池中的连接数。有一些用户需要在一些突然增大会连接数的操作之后快速地释放不必要的连接。你可以通过把maxIdleTimeExcessConnetions设定为一个比 maxIdleTime小得多的值来达到这个目的。超过最小连接数的那些连接会在较小的一段空闲时间之后被连接池剔除。
连接测试配置
idleConnetionTestPeriod, testConnectionOnCheckout和testConnectionOnCheckin 决定了连接何时被测试。automaticTestTable, connectionTesterClassName 和 preferredTestQuery决定了连接怎样被测试。
Statement池配置
maxStatement定义了每个数据源会缓存的PreparedStatement 的总数。池内的Statement 总数在达到这个限制时会销毁那些最近最近最少使用的(least-recently-used)Statement。这听起来很简单,不过事实上有些奇怪,因为从概念上来讲,被缓存的 Statement是属于单个的数据库连接的,它们并不是全局资源。为了弄清楚maxStatements 的大小,你不应该简单地认为它就是池中 statement的数量,你应该将你的应用程序中的最常用的PreparedStatement的数量乘以合理的连接数(比如在一个高负荷的应用中的 maxPoolSize值)。
数据库故障修复配置
当 c3p0 在尝试获取数据库连接失败时,会自动地重试 acquireRetryAttempts次,每次间隔 acquireRetryDelay。如果依然失败,所有在等待这些连接的客户端将会收到一个异常,用来表示不能获取连接。请注意,如果不是所有的获取连接尝试都失败,客户端并不会收到异常,这可能在初始化尝试获取连接之后还需要一点儿时间。如果acquireRetryAttempts 被设置为0,c3p0将会无限期地尝试获取一个新的连接,对 getConnection()的调用可能会无限阻塞下去,直到成功获取一个连接。
请注意,如果数据库重启了,一个连接池也许还维持着那些以前获取的而现在变得不可用的连接。默认情况下,这些陈旧的连接不会被马上发现并且清理掉,当一个应用程序使用它们的时候,会马上得到一个异常。设定 maxIdleTime 或者maxConnectionAge 可以帮助你加速替换掉这些不可用的连接。(见连接寿命的管理)如果你想完全避免应用程序因此遇到异常,你必须得指定一中连接测试策略用来在客户端使用不可用连接之前就清理掉它们。(见连接测试的配置)即使使用积极的连接测试(testConnectionsOnCheckout设置为true,或者testConnectionsOnCheckin为true并且设置了一个小的 idleConnectionTestPeriod值),你的应用程序在数据库重启的时候依然有可能遇到一个相关的异常,比如数据库在你已经将连接测试成功后才重启。
未结束事务处理方式配置
如果你想要 c3p0 在连接返回连接池时(checkin )提交未结束的事务,只需要把
autoCommitOnClose 设置为 true。如果你希望自己管理这些未结束的事务的话(并且没有设置连接的 autoCommit 属性), 你可以把forceIgnoreUnresolvedTransactions 设置为 true。我们强烈地不鼓励设置 forceIgnoreUnresolvedTransactions 的值,因为如果客户端在连接关闭前即没有回滚也没有提交事务,并且也没有开启自动提交的话,一些奇怪的不可再生的行为(unreproduceable behavior)和数据库被锁住的现象会发生。