2014-09-26 42 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()方法還分配至少一個具有固定容量的隊列,該隊列永遠不會在代碼中的其他位置更新。
相關問題