我想配置我的c3p0连接池,以便至少2个连接始终处于 Activity 状态,最多5个,并且超过前2个的空闲连接将在合理的时间内(例如一个小时)到期。

所有这些听起来很简单,只是文档似乎暗示maxIdleTimemaxIdleTimeExcessConnections函数之间没有区别,这使我感到困惑。

Basic pool configuration状态:



minPoolSize用法:



好,太棒了。并配置连接时间:



因此,这意味着minPoolSize仅在与maxIdleTimeExcessConnections结合使用时才重要,否则它将被完全忽略。

证实maxIdleTime的文档没有提及minPoolSize:


maxIdleTimeExcessConnections很有意义:



我发现minPoolSize这个基本功能真的很奇怪,它仅在与我认为是更高级的功能一起使用时才重要。这一切正确吗?

最佳答案

多么认真和合法地阅读!

但是不,这是不正确的。

连接可能会以多种方式消失。如您所说:



“上述参数”包括maxConnectionAgemaxIdleTimemaxIdleTimeExcessConnections。连接也可以从池中删除,因为它们在空闲时未通过连接测试(请参阅idleConnectionTestPeriod),由于它们在 checkin 或 checkout 时失败的测试(testConnectionOnCheckintestConnectionOnCheckout),或者因为它们失败而导致测试失败,而这些测试是由Exception中的Exception触发的客户使用过程。

但是,池会缩小,因此minPoolSize很重要,因为如果池缩小到minPoolSize以下,则将替换销毁的连接,直到还原minPoolSize
maxIdleTimeExcessConnections的独特之处在于其行为直接取决于相对于minPoolSize的池的大小。所有其他参数和测试都可以完成任务。如果他们碰巧使池的容量低于minPoolSize,那么c3p0会自动将池的容量带回minPoolSize。但是maxIdleTimeExcessConnections是不同的。它仅在池大于minPoolSize时才有效。

如您所说,maxIdleTimeExcessConnections是一项高级功能。大多数用户从不使用,也永远不需要使用它。之所以添加它,是因为某些用户想要积极地迫使池收缩到minPoolSize,但是使用非常短的无条件maxIdleTime这样做会导致不必要地搅动Connections,因为即使是minPoolSize池中的Connection都会不断过期并被替换。设置长的或不存在的maxIdleTime,而设置短的maxIdleTimeExcessConnections,则可以在池达到minPoolSize的情况下快速,主动地缩小收缩而无需通过Connections产生所需的结果。

但是即使没有设置maxIdleTimeExcessConnectionsminPoolSize也非常重要。连接确实会从池中销毁并清除,并且minPoolSize确定一个阈值,低于此阈值将自动替换销毁的连接,即使没有客户端负载引起池扩展。

我希望这是有道理的!

09-27 06:24