Java maxIdleTimeExcessConnections与c3p0中的maxIdleTime有何不同?
我想配置我的c3p0连接池,以便至少有2个连接始终处于活动状态,最多5个,超过前2个的空闲连接将在合理的时间(例如一小时)内过期 这听起来很简单,只是文档似乎暗示函数Java maxIdleTimeExcessConnections与c3p0中的maxIdleTime有何不同?,java,jdbc,connection-pooling,c3p0,Java,Jdbc,Connection Pooling,C3p0,我想配置我的c3p0连接池,以便至少有2个连接始终处于活动状态,最多5个,超过前2个的空闲连接将在合理的时间(例如一小时)内过期 这听起来很简单,只是文档似乎暗示函数maxIdleTime和maxIdleTimeExcessConnections之间没有区别,这让我很困惑 国家: 在minPoolSize和maxPoolSize之间的范围内,池中的连接数根据使用模式而变化。每当用户请求连接时,连接数就会增加,没有可用的连接,并且池在管理的连接数中尚未达到maxPoolSize。由于连接获取非常缓
maxIdleTime
和maxIdleTimeExcessConnections
之间没有区别,这让我很困惑
国家:
在minPoolSize和maxPoolSize之间的范围内,池中的连接数根据使用模式而变化。每当用户请求连接时,连接数就会增加,没有可用的连接,并且池在管理的连接数中尚未达到maxPoolSize。由于连接获取非常缓慢,因此,成批急切地增加连接数量几乎总是有用的,而不是在负载增加时强迫每个客户端等待新连接来触发单个获取。acquireIncrement确定c3p0池在连接用尽时尝试获取的连接数。(无论acquireIncrement如何,池将永远不允许超过maxPoolSize。)
和minPoolSize
用法:
池在任何给定时间将保持的最小连接数
好的,很好。和用于配置连接时间:
maxIdleTimeExcessConnections是关于在c3p0池未加载时最小化该池持有的连接数。默认情况下,c3p0池在负载下增长,但仅当连接未通过连接测试或通过上述参数过期时才会收缩。一些用户希望他们的池在使用量猛增后能够快速释放不必要的连接,从而导致池的大小变大。您可以通过将maxIdleTimeExcessConnections设置为比maxIdleTime短得多的值来实现这一点,如果超过设置的最小大小的连接闲置时间超过一小段时间,则强制释放这些连接
因此,这意味着minPoolSize
仅在与maxIdleTimeExcessConnections
结合使用时才起作用,否则,它将被完全忽略
证实maxIdleTime
的文档时,没有提到minPoolSize
:
在丢弃连接之前,连接可以保持池状态但未使用的秒数。零表示空闲连接永不过期
而且maxIdleTimeExcessConnections
有意义:
在剔除之前,应允许超过minPoolSize的连接在池中保持空闲的秒数。适用于希望最大限度地减少打开的连接数的应用程序,如果在出现峰值后,负载级别降低,并且不再需要获取的连接,则将池缩小到minPoolSize。如果设置了maxIdleTime,则如果参数要产生任何影响,maxIdleTimeExcessConnections应该更小。零表示没有强制,多余的连接不会空闲
我觉得非常奇怪的是,
minPoolSize
,一个基本功能,只在与我认为更高级的功能一起使用时才起作用。这一切都对吗?多么仔细和律师般的阅读啊
但是不,这是不对的
有几种方法可以终止连接。正如你所引述:
c3p0池…如果连接测试失败或通过上述参数过期,则收缩
“上述参数”包括maxConnectionAge
,maxIdleTime
,以及maxIdleTimeExcessConnections
。连接也可以从池中删除,因为它们在空闲时未通过连接测试(请参阅idleConnectionTestPeriod
),因为它们在签入或签出时未通过测试(testConnectionOnCheckin
,testConnectionOnCheckout
),或者因为在客户端使用过程中出现异常而导致测试失败
但是,池会收缩,minPoolSize
很重要,因为如果池收缩到minPoolSize
以下,则会替换被破坏的连接,直到恢复minPoolSize
maxIdleTimeExcessConnections
的独特之处在于,它的行为直接取决于相对于minPoolSize
的池大小。所有其他参数和测试都只是做它们自己的事情。如果他们的操作恰好使池的大小低于minPoolSize
,那么c3p0将自动将池的大小恢复到minPoolSize
。但是maxIdleTimeExcessConnections
是不同的。它仅在池大于minPoolSize
时才有效
正如您所说,maxIdleTimeExcessConnections
是一项高级功能。大多数用户从来没有也不需要使用它。之所以添加它,是因为一些用户希望积极地强制池收缩回minPoolSize,但使用非常短的无条件maxIdleTime
会导致不必要的连接流失,因为即使在minPoolSize
池中,连接也会不断过期和更换。设置长的或不存在的maxIdleTime
,而设置短的maxIdleTimeExcessConnections
可以在池达到minPoolSize
时快速、积极地收缩连接,而不影响连接
但是,即使没有maxIdleTimeExcessConnections
set,minPoolSize
也非常重要。连接确实会被销毁并从池中删除,并且minPoolSize
确定一个阈值,低于该阈值,即使没有客户端负载引起池扩展,也会自动替换已销毁的连接
我希望这是有意义的 史蒂夫·沃克曼的回答很好,我只想补充一个简短的答案:
server.session.timeout=3600