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

缺少 Azure Maven 任务输出

Wildfly + Eclipse 部署扫描程序

reactjs错误-onChange不是函数错误

Jackson marshal/unmarshal 在 jaxrs wildfly 15 中表现不同

如何使用 WildFly 连接到受 Kerberos 保护的 Apache Phoenix 数据源?