我想配置我的c3p0连接池,以便至少2个连接始终处于 Activity 状态,最多5个,并且超过前2个的空闲连接将在合理的时间内(例如一个小时)到期。
所有这些听起来很简单,只是文档似乎暗示maxIdleTime
和maxIdleTimeExcessConnections
函数之间没有区别,这使我感到困惑。
Basic pool configuration状态:
和minPoolSize
用法:
好,太棒了。并配置连接时间:
因此,这意味着minPoolSize
仅在与maxIdleTimeExcessConnections
结合使用时才重要,否则它将被完全忽略。
证实maxIdleTime
的文档没有提及minPoolSize
:
maxIdleTimeExcessConnections
很有意义:
我发现minPoolSize
这个基本功能真的很奇怪,它仅在与我认为是更高级的功能一起使用时才重要。这一切正确吗?
最佳答案
多么认真和合法地阅读!
但是不,这是不正确的。
连接可能会以多种方式消失。如您所说:
“上述参数”包括maxConnectionAge
,maxIdleTime
和maxIdleTimeExcessConnections
。连接也可以从池中删除,因为它们在空闲时未通过连接测试(请参阅idleConnectionTestPeriod
),由于它们在 checkin 或 checkout 时失败的测试(testConnectionOnCheckin
,testConnectionOnCheckout
),或者因为它们失败而导致测试失败,而这些测试是由Exception中的Exception触发的客户使用过程。
但是,池会缩小,因此minPoolSize
很重要,因为如果池缩小到minPoolSize
以下,则将替换销毁的连接,直到还原minPoolSize
。maxIdleTimeExcessConnections
的独特之处在于其行为直接取决于相对于minPoolSize
的池的大小。所有其他参数和测试都可以完成任务。如果他们碰巧使池的容量低于minPoolSize
,那么c3p0会自动将池的容量带回minPoolSize
。但是maxIdleTimeExcessConnections
是不同的。它仅在池大于minPoolSize
时才有效。
如您所说,maxIdleTimeExcessConnections
是一项高级功能。大多数用户从不使用,也永远不需要使用它。之所以添加它,是因为某些用户想要积极地迫使池收缩到minPoolSize,但是使用非常短的无条件maxIdleTime
这样做会导致不必要地搅动Connections,因为即使是minPoolSize
池中的Connection都会不断过期并被替换。设置长的或不存在的maxIdleTime
,而设置短的maxIdleTimeExcessConnections
,则可以在池达到minPoolSize
的情况下快速,主动地缩小收缩而无需通过Connections产生所需的结果。
但是即使没有设置maxIdleTimeExcessConnections
,minPoolSize
也非常重要。连接确实会从池中销毁并清除,并且minPoolSize
确定一个阈值,低于此阈值将自动替换销毁的连接,即使没有客户端负载引起池扩展。
我希望这是有道理的!