Java Spring多租户:在添加用户时动态向MultiTenantConnectionProvider添加数据源
我有一个场景,其中一个用户注册并为他们创建一个新的数据库。注册过程完成后,需要将此数据库添加到MultiTenantConnectionProvider(连接池)中。一切正常,但我无法将数据源动态添加到MultiTenantConnectionProvider 多租户的休眠配置:Java Spring多租户:在添加用户时动态向MultiTenantConnectionProvider添加数据源,java,spring,multi-tenant,Java,Spring,Multi Tenant,我有一个场景,其中一个用户注册并为他们创建一个新的数据库。注册过程完成后,需要将此数据库添加到MultiTenantConnectionProvider(连接池)中。一切正常,但我无法将数据源动态添加到MultiTenantConnectionProvider 多租户的休眠配置: <property name="hibernateProperties"> <props> <prop key="hi
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.multiTenancy">DATABASE</prop>
<prop key="hibernate.tenant_identifier_resolver">com.company.multitenancy.MyCurrentTenantIdentifierResolverImpl
</prop>
<prop key="hibernate.multi_tenant_connection_provider">com.company.multitenancy.MyMultiTenantConnectionProvider
</prop>
</props>
</property>
要连接到我正在使用的特定租户,请执行以下操作:
sessionFactory.withOptions().tenantIdentifier(tenantId).openSession();
除了实现ConnectionProviderImpl之外,您的配置似乎是正确的。在这个实现中,您需要为hibernate提供租户标识符。您需要实现AbstractDataSourceBasedMultiTenantConnectionProviderImpl,并根据您使用的Hibernate版本覆盖getConnection()或选择DataSource()。我建议您遵循Hibernate用户指南示例16.3和本文。感谢您的快速回复,使用这段代码一切都很完美。我现在面临的唯一问题是,当一个用户注册一个新的数据库时,为该用户创建了一个新的租户id,并且生成了一个新的租户id,我需要将此租户id添加到连接池中,但我无法添加。任何指针都有帮助,您可以尝试扩展AbstractDataSourceBasedMultiTenantConnectionProviderImpl并覆盖selectDataSource(),而不是直接实现ConnectionProvider吗。MyCurrentTenantIdentifier ResolverImpl#resolveCurrentTenantIdentifier()返回租户标识符。此租户标识符用于AbstractDataSourceBasedMultiTenantConnectionProviderImpl#selectDataSource(字符串租户标识符)。
package com.company.multitenancy;
import org.hibernate.context.spi.CurrentTenantIdentifierResolver;
import com.termbreak.constant.ConstantStrings;
public class MyCurrentTenantIdentifierResolverImpl implements
CurrentTenantIdentifierResolver {
public ThreadLocal<String> _tenantIdentifier = new ThreadLocal<String>();
public String DEFAULT_TENANT_ID = ConstantStrings.DEFAULT_TENANT_ID;
public String resolveCurrentTenantIdentifier() {
System.out.println("from inside resolveCurrentTenantIdentifier....");
String tenantId = _tenantIdentifier.get();
if (tenantId == null)
tenantId = DEFAULT_TENANT_ID;
System.out.println("threadlocal tenant id =" + tenantId);
return tenantId;
}
public boolean validateExistingCurrentSessions() {
return true;
}
}
package com.company.multitenancy;
import java.sql.Connection;
import java.sql.SQLException;
import org.apache.commons.dbcp2.BasicDataSource;
import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;
public class ConnectionProviderImpl implements ConnectionProvider {
private static final long serialVersionUID = -8926112316994338537L;
private BasicDataSource basicDataSource;
public ConnectionProviderImpl(String database){
//this should be read from properties file
basicDataSource = new BasicDataSource();
basicDataSource.setDriverClassName("com.mysql.jdbc.Driver");
basicDataSource.setUrl("jdbc:mysql://localhost:3306/"+database);
basicDataSource.setUsername("root");
basicDataSource.setPassword("root");
basicDataSource.setInitialSize(2);
}
public boolean isUnwrappableAs(Class arg0) {
return false;
}
public Object unwrap(Class arg0) {
return null;
}
public void closeConnection(Connection arg0) throws SQLException {
arg0.close();
}
public Connection getConnection() throws SQLException {
return basicDataSource.getConnection();
}
public boolean supportsAggressiveRelease() {
return false;
}
}
sessionFactory.withOptions().tenantIdentifier(tenantId).openSession();