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