maxIdleTimeExcessConnections与c3p0中的maxIdleTime有何不同?

时间:2014-03-27 17:44:32

标签: java jdbc connection-pooling c3p0

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

这听起来很简单,除了文档似乎暗示函数maxIdleTimemaxIdleTimeExcessConnections之间没有区别,这让我感到困惑。

Basic pool configuration州:

  

在minPoolSize和maxPoolSize之间的范围内,池中的连接数根据使用模式而有所不同。每当用户请求连接,没有可用的连接,并且池中尚未达到管理的Connections数量的maxPoolSize时,连接数就会增加。由于连接获取速度非常慢,因此在批量生成中急切地增加连接数量几乎总是有用的,而不是强迫每个客户端等待新连接在负载增加时引发单个获取。 acquireIncrement确定当池用完连接时c3p0池将尝试获取的连接数。 (无论acquireIncrement如何,池都不会允许超出maxPoolSize。)

minPoolSize用法:

  

池在任何给定时间将保持的最小连接数。

好的,太好了。并且用于配置连接时间:

  

maxIdleTimeExcessConnections用于在池未加载时最小化c3p0池所持有的连接数。默认情况下,c3p0池在负载下增长,但只有在Connections通过Connection测试失败或通过上述参数过期时才会收缩。一些用户希望他们的池在强制使用大量池大小的使用高峰后快速释放不必要的连接。您可以通过将maxIdleTimeExcessConnections设置为比maxIdleTime短得多的值来实现此目的,如果超出设置的最小大小的连接空闲时间超过一小段时间,则会强制释放。

所以暗示minPoolSize仅在与maxIdleTimeExcessConnections一起使用时才重要,否则,它将被完全忽略。

确认maxIdleTime的文档未提及minPoolSize

  

秒可以在丢弃之前保持池的连接但未使用。零表示空闲连接永不过期。

maxIdleTimeExcessConnections有道理:

  

应该允许超过minPoolSize的连接在被剔除之前在池中保持空闲的秒数。适用于希望积极减少打开连接数的应用程序,如果在峰值之后,负载级别减少并且不再需要连接,则将池缩回minPoolSize。如果设置了maxIdleTime,则如果参数有效,则maxIdleTimeExcessConnections应该更小。零意味着没有强制执行,多余的连接不会被闲置。

我觉得奇怪的是minPoolSize这个基本功能,只有在我看来是一个更高级的功能时才有用。这都是正确的吗?

3 个答案:

答案 0 :(得分:12)

小心谨慎的阅读!

但不,这不正确。

连接可以通过多种方式消亡。正如你所说:

  

c3p0 pool ...如果Connections连接测试失败或通过上述参数过期,则收缩。

“上述参数”包括maxConnectionAgemaxIdleTimemaxIdleTimeExcessConnections。也可以从池中删除连接,因为它们在空闲时失败连接测试(请参阅idleConnectionTestPeriod),因为它们在签入或签出时未通过测试(testConnectionOnCheckintestConnectionOnCheckout) ,或者因为它们在客户使用过程中由异常触发的测试失败。

但是池缩小,minPoolSize很重要,因为如果池缩小到minPoolSize以下,则会删除已解锁的Connections ,直到minPoolSize恢复为止。

maxIdleTimeExcessConnections的独特之处在于它的行为直接取决于相对于minPoolSize的池的大小。所有其他参数和测试只是做他们的事情。如果他们的事情恰好使游泳池低于minPoolSize,那么c3p0会自动将游泳池带回minPoolSize。但是maxIdleTimeExcessConnections是不同的。只有当池大于minPoolSize时才会产生任何影响。

正如您所说,maxIdleTimeExcessConnections是一项高级功能。大多数用户永远不会,也不需要使用它。之所以添加,是因为有些用户希望积极强制池缩小回minPoolSize,但是使用非常短的无条件maxIdleTime执行此操作会导致不必要的连接流失,因为即使在minPoolSize池中的连接也会不断过期并取代。设置较长或不存在maxIdleTime,同时设置短maxIdleTimeExcessConnections会产生快速,积极收缩的预期结果,而不会在游戏池点击minPoolSize后通过Connections进行搅动。

但即使没有设置maxIdleTimeExcessConnectionsminPoolSize也非常重要。连接确实从池中被销毁并被清除,minPoolSize确定了一个阈值,在该阈值之下,即使没有客户端负载引起池扩展,也会自动替换被破坏的Connections。

我希望这是有道理的!

答案 1 :(得分:1)

史蒂夫沃德曼的回答很好,我只想补充一个简短的答案:

不同之处在于,即使在minPoolSize - d个游泳池中,maxIdleTime也会替换空闲连接,而maxIdleTimeExcessConnections则会赢得

答案 2 :(得分:0)

springboot-1.5 x-application.properties-

server.session.timeout=3600