jboss-6.0.0.Final 与 wildfly-10.1.0.Final 中的每个用户数据源连接池(通过安全域)
Posted
技术标签:
【中文标题】jboss-6.0.0.Final 与 wildfly-10.1.0.Final 中的每个用户数据源连接池(通过安全域)【英文标题】:Per-user data-source connection pools (via security-domain) in jboss-6.0.0.Final vs wildfly-10.1.0.Final 【发布时间】:2018-11-06 01:14:43 【问题描述】:回到 Jboss-6.0.0.Final 我们有以下数据源/池定义:
<datasources>
<xa-datasource>
<jndi-name>pgsql</jndi-name>
<track-connection-by-tx>true</track-connection-by-tx>
<xa-datasource-class>org.postgresql.xa.PGXADataSource</xa-datasource-class>
<xa-datasource-property name="ServerName">localhost</xa-datasource-property>
<xa-datasource-property name="PortNumber">5432</xa-datasource-property>
<xa-datasource-property name="DatabaseName">somedb</xa-datasource-property>
<security-domain>postgresqluser</security-domain>
<min-pool-size>0</min-pool-size>
<max-pool-size>5</max-pool-size>
</xa-datasource>
</datasources>
security-domain postgresqluser 的定义是:
<application-policy name="postgresqluser">
<authentication>
<login-module code="org.jboss.resource.security.CallerIdentityLoginModule" flag="required">
<module-option name = "managedConnectionFactoryName">jboss.jca:service=XATxCM,name=pgsql</module-option>
</login-module>
</authentication>
</application-policy>
所以这给了我们每个用户一个最大大小为 5 的池(5 是应用程序需要的最多 + 1)。如果一个用户滥用系统,并试图获得超过 5 个连接(例如通过快速按 F5),其余用户不会受到影响,因为他/她所能做的就是阻止等待更多连接。
现在我们将上面的配置迁移到wildfly-10.1.0.Final,如下:
<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>
<xa-datasource-class>org.postgresql.xa.PGXADataSource</xa-datasource-class>
<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>5</max-pool-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>
我们目睹的行为不同,wildfly似乎给第一个用户他的5个连接,只要没有其他用户登录系统,他就可以工作。当第二个用户登录时,它似乎给了他 5 个连接(通过查看 postgresql 活动和日志),但它似乎无法同时处理所有 10 个连接,然后是第二个用户被阻止或第一个用户的一些连接尝试也被阻止。通过在 wildfly 中指定 max-pool-size=10 似乎能够成功处理前两个用户。我知道(通过查看日志)wildfly 中的默认池使用策略: org.jboss.jca.core.connectionmanager.pool.strategy.PoolBySubjectAndCri 。 所以我猜现在wildfly子池的语义已经改变为对同一个池进行分区,而不是像jboss-6.0.0.Final中那样使用多个池实例。
我的理解正确吗?如果是,这意味着 max-pool-size 适用于整个池,那么有没有办法限制每个用户的连接? (我知道我们可以在数据库层限制用户,但我们希望能够复制旧的行为,然后再进行新的更改)。
【问题讨论】:
【参考方案1】:只需在后端前和应用后使用 pgbouncer。
【讨论】:
正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。以上是关于jboss-6.0.0.Final 与 wildfly-10.1.0.Final 中的每个用户数据源连接池(通过安全域)的主要内容,如果未能解决你的问题,请参考以下文章
将 JMX Exporter 与 Wildfly 15 一起使用时出现 NoClassDefFoundError