c3p0池没有缩小

时间:2014-01-24 22:18:47

标签: spring connection-pooling c3p0

我正在使用带有Spring的c3p0连接池(使用普通的jdbc,没有hibernate)。这是我的游泳池配置

<bean id="myDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <property name="driverClass" value="${jdbc.driver}"/>
    <property name="jdbcUrl" value="${jdbc.url}"/>
    <property name="user" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
    <property name="acquireIncrement" value="3"/>
    <property name="minPoolSize" value="3"/>
    <property name="maxPoolSize" value="25"/>
    <property name="maxStatementsPerConnection" value="0"/>
    <property name="numHelperThreads" value="6"/>        
    <property name="testConnectionOnCheckout" value="false" />
    <property name="testConnectionOnCheckin" value="false" />
    <property name="idleConnectionTestPeriod" value="10"/>
    <property name="preferredTestQuery" value="select curdate()"/>
    <property name="maxIdleTime" value="5" />   
    <property name="unreturnedConnectionTimeout" value="5" />     
    <property name="debugUnreturnedConnectionStackTraces" value="true" />
</bean>

我正在使用JMX来监控我的连接池。我看到我的游泳池在负载下增长到25但从未收缩。我在这里错过了一些cofig吗?

1 个答案:

答案 0 :(得分:2)

默认设置是不缩小池。您需要设置maxIdleTimeExcessConnections。从手册(重点补充):

  

maxIdleTimeExcessConnections

     

默认值:0

     

超过minPoolSize的连接的秒数   在被淘汰之前允许在池中闲置。 打算用于   希望积极减少开放数量的应用程序   连接,将池缩小回minPoolSize if,如下   一个尖峰,负载水平减少,连接获得是否定的   需要更久。如果设置了maxIdleTime,则为maxIdleTimeExcessConnections   如果参数有任何影响,应该更小。 零意味着   没有强制执行,多余的连接不会闲置。

让您的游泳池在高负荷后缩小:

  • 为minPoolSize和maxPoolSize定义合理的值。默认值分别为3和15,适用于许多应用程序。
  • 设置maxIdleTime的值。我选择了2700秒(45分钟),因为我的应用程序和数据库服务器之间的思科防火墙在一小时后超时了TCP连接。 C3P0将丢弃闲置时间超过这段时间的连接。
  • 设置maxIdleTimeExcessConnections的值。我选了600秒(10分钟)。 C3P0将关闭在这段时间内闲置的连接,直到只打开minPoolSize连接。