我想为我们的Java EE软件使用多租户架构。 我们使用WildFly 8.2(JPA与Hibernate 4.3.7)在PostgreSQL 9.3多租户软件中的WildFly/JPA数据库连接泄漏
我知道休眠的多租户提供了一些API:http://docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html/ch16.html
而且我们可以把它与JPA在这样的persistence.xml文件整合:
<property name="hibernate.multiTenancy" value="SCHEMA"/>
<property name="hibernate.tenant_identifier_resolver" value="mycompany.hibernate.multitenant.SchemaResolver"/>
<property name="hibernate.multi_tenant_connection_provider" value="mycompany.hibernate.multitenant.MultiTenantProvider"/>
但我有一些问题与我的“hibernate.multi_tenant_connection_provider”。
我想使用我的WildFly配置(standalone.xml)中的数据源池,但是如果我使用它,会导致池中的连接泄漏。 连接永远不会释放到池中。
我是否需要使用另一个库来管理我的数据库连接池,如C3P0?我虽然认为WildFly可以正确管理它。 有没有更好的方法来集成多租户与JPA?
或者可能是我的JNDI查找问题?
如果我使用SCHEMA作为多租户配置,那么连接始终是相同的数据库/数据源,那么为什么我们需要编写一些连接提供程序?
你有什么想法吗? 提前感谢您的帮助。
public class MultiTenantProvider implements MultiTenantConnectionProvider {
@Override
public boolean supportsAggressiveRelease() {
return false;
}
@Override
public boolean isUnwrappableAs(Class clazz) {
return false;
}
@Override
public <T> T unwrap(Class<T> clazz) {
return null;
}
@Override
public Connection getAnyConnection() throws SQLException {
Context initContext;
Connection connection = null;
try {
initContext = new InitialContext();
DataSource ds = (DataSource) initContext.lookup("java:/MyPostgresDS");
connection = ds.getConnection();
} catch (NamingException e) {
e.printStackTrace();
}
return connection;
}
@Override
public Connection getConnection(String tenantIdentifier) throws SQLException {
final Connection connection = getAnyConnection();
try {
connection.createStatement().execute("SET SCHEMA '" + tenantIdentifier + "'");
}
catch (SQLException e) {
throw new HibernateException("Could not alter JDBC connection to specified schema [" + tenantIdentifier + "]", e);
}
return connection;
}
@Override
public void releaseAnyConnection(Connection connection) throws SQLException {
try {
connection.createStatement().execute("SET SCHEMA 'public'");
}
catch (SQLException e) {
throw new HibernateException("Could not alter JDBC connection to specified schema [public]", e);
}
connection.close();
}
@Override
public void releaseConnection(String tenantIdentifier, Connection connection) throws SQLException {
releaseAnyConnection(connection);
}
}
数据源中WildFly
的standalone.xml文件<datasource jndi-name="java:/MyPostgresDS" pool-name="MyPostgresDS" enabled="true" use-java-context="true">
<connection-url>jdbc:postgresql:demo</connection-url>
<driver>posgresqlDriver</driver>
<pool>
<min-pool-size>10</min-pool-size>
<max-pool-size>50</max-pool-size>
<prefill>true</prefill>
</pool>
<security>
<user-name>postgres</user-name>
<password>postgres</password>
</security>
<timeout>
<blocking-timeout-millis>20000</blocking-timeout-millis>
<idle-timeout-minutes>5</idle-timeout-minutes>
</timeout>
</datasource>
没有人可以帮我这个发现泄漏? :( – nico2324325