2014-09-26 66 views
2

我有一个连接了Groovy控制台的webapp。我可以动态更改org.apache.tomcat.jdbc.pool.DataSource的maxActive属性吗?

我有以下豆通过XML配置:

<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应用程序上下文。

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

回答

1

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

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

+0

这个人应该可能会收到一些实际的运行时验证。它看起来像代码可能期望maxActive属性不会在运行时更改。 – EricHenry 2014-09-26 16:14:11

+0

尽管如此,池可以通过JMX暴露... – EricHenry 2014-09-26 16:15:48

2

我找不到文档中无论是什么,但看执行我敢肯定它不是打算初始化由于以下原因之后支持修改:

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