我可以动态更改org.apache.tomcat.jdbc.pool.DataSource的maxActive属性吗?

时间:2014-09-26 15:01:48

标签: java jdbc connection-pooling

我运行了一个连接了Groovy控制台的webapp。

我通过XML配置了以下bean:

<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource">
        <property name="driverClassName" value="${db.driverClass}"/>
        <property name="url" value="${db.url}"/>
        <property name="username" value="${db.username}"/>
        <property name="password" value="${db.password}"/>
        <property name="validationQuery" value="${db.validationQuery}" />
        <property name="testOnBorrow" value="true" />
        <property name="testWhileIdle" value="true" />
        <property name="timeBetweenEvictionRunsMillis" value="1800000" />
        <property name="numTestsPerEvictionRun" value="8" />
        <property name="removeAbandoned" value="true"/>
        <property name="logAbandoned" value="true"/>
        <property name="removeAbandonedTimeout" value="60"/>

        <!--connection pooling props -->
        <property name="maxActive" value="${db.maxActive}"/>
        <property name="maxIdle" value="${db.maxIdle}"/>
        <property name="maxAge" value="${db.maxAge}"/>
        <property name="maxWait" value="${db.maxWait}"/>
        <property name="initialSize" value="${db.initialSize}"/>
        <property name="minIdle" value="${db.minIdle}"/>
    </bean>

通过Groovy控制台,我可以轻松地调用:

appCtx.getBean("dataSource").setMaxActive(someNumber);

其中appCtx是我的Spring应用程序上下文。

我的问题是,实际是否会更改连接池行为。我发现的所有链接似乎都集中在初始配置上。我在池建立后尝试修改配置。

2 个答案:

答案 0 :(得分:2)

我在文档中找不到任何内容,但从查看实现情况来看,我非常确定它不支持在初始化后支持修改,原因如下:

  • 除了更新字段值外,没有编写代码来处理该属性的更新。
  • 在org.apache.tomcat.jdbc.pool.ConnectionPool.init()中有很多代码可以验证该属性。如果稍后设置该属性,则不会运行该代码。
  • init()方法还分配至少一个具有固定容量的队列,该队列永远不会在代码中的其他位置更新。

答案 1 :(得分:1)

在检查org.apache.tomcat.jdbc.pool.ConnectionPool时,看起来它正在从池中获取连接时检查maxActive属性。

所以我不能说我从经验中知道,但看起来应该可以在运行时设置这个值。