jboss-6.0.0.Final与wildfly-10.1.0.Final中的每用户数据源连接池(通过安全域)

时间:2018-05-27 06:09:07

标签: jboss connection wildfly connection-pooling

回到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>

安全域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适用于整个池,那么有没有办法限制每个用户的连接? (我知道我们可以限制数据库层的用户,但我们希望能够在继续进行新的更改之前复制旧的行为。)

0 个答案:

没有答案