You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JBoss 6.0.0.Final与WildFly 10.1.0.Final按用户数据源连接池疑问

问题解答

你的理解是否正确?

完全正确!WildFly 默认的 PoolBySubjectAndCri 池策略确实是将连接池按用户(Subject)+ 连接请求标识(Cri)划分成多个子池(subpool),但这些子池都隶属于同一个全局池实例。max-pool-size 参数是针对整个全局池的总连接上限,而非每个子池的单独上限。这就解释了为什么设置 max-pool-size=5 时,两个用户会共享这5个全局连接配额,第二个用户无法获得额外连接从而出现阻塞;而设为10时,全局配额足够两个用户各用5个,所以恢复正常。

如何复现JBoss 6的“每个用户独立连接池限制”行为?

要实现每个用户最多使用5个连接、互不影响的效果,你需要在WildFly的数据源配置中添加子池单独上限的配置,具体操作如下:

  1. 添加per-subpool-max-size参数
    在<xa-pool>节点下增加<per-subpool-max-size>5</per-subpool-max-size>,这个参数专门用于设置每个子池(即单个用户)的最大连接数。

  2. 调整全局max-pool-size为合理值
    全局的max-pool-size需要设置为足够容纳预期最大用户数×单个用户上限的数值(比如如果最多有4个并发用户,设为20即可),避免全局配额不足影响多用户使用。

修改后的完整配置示例

<xa-datasource jndi-name="java:/pgsql" pool-name="smaDS" enabled="true" use-ccm="true" mcp="org.jboss.jca.core.connectionmanager.pool.mcp.LeakDumperManagedConnectionPool" statistics-enabled="true">
    <xa-datasource-class>org.postgresql.xa.PGXADataSource</xa-datasource-class>
    <xa-datasource-property name="PortNumber">5432</xa-datasource-property>
    <xa-datasource-property name="DatabaseName">somedb</xa-datasource-property>
    <xa-datasource-property name="ServerName">localhost</xa-datasource-property>
    <driver>postgresql-9.4.1212.jar</driver>
    <xa-pool>
        <min-pool-size>0</min-pool-size>
        <initial-pool-size>0</initial-pool-size>
        <max-pool-size>20</max-pool-size> <!-- 全局总上限,按需调整 -->
        <per-subpool-max-size>5</per-subpool-max-size> <!-- 单个用户的连接上限 -->
        <allow-multiple-users>true</allow-multiple-users>
        <wrap-xa-resource>true</wrap-xa-resource>
    </xa-pool>
    <security>
        <security-domain>postgresqluser</security-domain>
    </security>
</xa-datasource>
<security-domain name="postgresqluser">
    <authentication>
        <login-module code="org.picketbox.datasource.security.CallerIdentityLoginModule" flag="required">
            <module-option name="password-stacking" value="useFirstPass"/>
        </login-module>
    </authentication>
</security-domain>

额外说明

  • 确保allow-multiple-users="true"保持开启,这是WildFly支持多用户子池的前提条件。
  • 你的CallerIdentityLoginModule配置是正确的,WildFly中不再需要managedConnectionFactoryName参数,因为security-domain已经和数据源直接关联。

内容的提问来源于stack exchange,提问作者panix Panixgr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:07:41