我在我的專案中使用 Apache Tomcat JDBC 連接池庫并相應地配置了 context.xml 檔案。我的應用程式實體需要在多個位置運行,但應用程式上的負載會有所不同,因此我想在運行時根據特定實體的客戶大小修改 maxActive 大小和其他一些屬性。
<Context path="/abc"
docBase="abc"
debug="5"
reloadable="false"
crossContext="true">
<Resource name="jdbc/abc"
auth="Container"
type="javax.sql.DataSource"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
driverClassName="xxxxx"
url="xxxxxxx"
username="xxxxx" password="xxxxxx"
maxActive="20"
initialSize="0"
...
/>
</Context>
uj5u.com熱心網友回復:
通過 JNDI 創建的資料源沒有什么特別之處:如果您知道它的類(org.apache.tomcat.jdbc.pool.DataSource在您的情況下),您可以轉換為該類并使用可用的 setter 對其進行配置:
private void customizeDataSource(final DataSource ds) {
if (ds instanceof PoolConfiguration) {
final PoolConfiguration poolConfig = (PoolConfiguration) ds;
poolConfig.setMaxActive(10);
}
}
(見定義PoolConfiguration)。的實作javax.sql.DataSource還實作了一個非常有用的介面Wrapper,如果您的代碼將 Tomcat JDBC 資料源包裝在其他東西中,它可能會派上用場:
private void customizeDataSource(final DataSource ds) throws SQLException {
if (ds.isWrapperFor(PoolConfiguration.class)) {
final PoolConfiguration poolConfig = ds.unwrap(PoolConfiguration.class);
poolConfig.setMaxActive(10);
}
}
但是,上述程式化方法可能會出現一些問題:
- 如果
tomcat-jdbc.jar與應用程式捆綁在一起,則只有在您的應用程式中配置的 JNDI 資源context.xml才能被您的代碼識別。GlobalNamingResources 中的那些將使用org.apache.tomcat.jdbc.pool.DataSource與 Tomcat 捆綁在一起的副本,并且不會匹配instanceof條件。 - 另一方面,如果您沒有包含
tomcat-jdbc.jar在您的 WAR 檔案中,您必須確保您設定的引數被您的應用程式將在其上運行的所有 Tomcat 版本支持。
uj5u.com熱心網友回復:
為此,您可以嘗試使用標準 JMX。
正如您在檔案中所見,Tomcat 可以將連接池公開為MBean 物件,您可以使用 JConsole 之類的工具與之互動。
該MBean實作基本上委托給實際org.apache.tomcat.jdbc.pool.ConnectionPool 可以通過MBean介面來執行的不同操作和,AFAIK,ConnectionPool動態地分配連接基于當前配置。
基于配置而非運行時行為的原始答案
請考慮查看這個相關的 SO 問題和自我提供的答案,我認為這可能會有所幫助。
Tomcat 在其組態檔中替換系統提供的環境變數:
Tomcat 組態檔被格式化為無模式 XML;元素和屬性區分大小寫。支持 Apache Ant 風格的變數替換;
propname可以使用語法 ${propname} 在組態檔中使用具有名稱的系統屬性。所有系統屬性都可用,包括使用-D語法設定的屬性、JVM 自動提供的屬性以及$CATALINA_BASE/conf/catalina.properties檔案中配置的 屬性。
如上所述,包含需要被 Tomcat 動態替換的屬性的最佳方法是使用-D選項將它們作為系統屬性傳遞,并且可能在JAVA_OPTS環境變數中傳遞。
如上述問題所示,并建議catalina.sh:
# Environment Variable Prerequisites
#
# Do not set the variables in this script. Instead put them into a script
# setenv.sh in CATALINA_BASE/bin to keep your customizations separate.
#
例如,在setenv.sh位于$CATALINA_BASE/bin目錄中的檔案中定義它們。
例如:
#! /bin/sh
export MAX_ACTIVE_CONNECTIONS=20
export JAVA_OPTS="$JAVA_OPTS -DmaxActiveConnections=$MAX_ACTIVE_CONNECTIONS"
并在您的 XML 組態檔中使用這些屬性:
<Context path="/abc"
docBase="abc"
debug="5"
reloadable="false"
crossContext="true">
<Resource name="jdbc/abc"
auth="Container"
type="javax.sql.DataSource"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
driverClassName="xxxxx"
url="xxxxxxx"
username="xxxxx" password="xxxxxx"
maxActive="${maxActiveConnections}"
initialSize="0"
...
/>
</Context>
uj5u.com熱心網友回復:
MySQL 連接迅速,從而使連接池的使用受到限制。
通常,如果存在性能問題,最好通過其他技術處理——復合索引、重新制定查詢、解決 MySQL 的優化限制等。
您是否愿意退后一步,讓我們分析瓶頸?
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/400330.html
