以编程方式修改 JNDI 连接池

ami*_*ngh 6 java mysql tomcat connection-pooling jdbc

我在项目中使用 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>
Run Code Online (Sandbox Code Playgroud)

jcc*_*ero 4

您可以尝试使用标准 JMX 来实现此目的。

正如您在文档中看到的,Tomcat 可以将连接池公开为MBean 对象,您可以使用 JConsole 等工具与之交互。

MBean实现基本上将 可以通过 MBean 接口执行的不同操作委托给实际的org.apache.tomcat.jdbc.pool.ConnectionPool ,并且根据当前配置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.
#
Run Code Online (Sandbox Code Playgroud)

例如,在setenv.sh位于$CATALINA_BASE/bin目录中的文件中定义它们。

例如:

# 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.
#
Run Code Online (Sandbox Code Playgroud)

并在 XML 配置文件中使用这些属性:

#! /bin/sh

export MAX_ACTIVE_CONNECTIONS=20

export JAVA_OPTS="$JAVA_OPTS -DmaxActiveConnections=$MAX_ACTIVE_CONNECTIONS"
Run Code Online (Sandbox Code Playgroud)