Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring多租户:在添加用户时动态向MultiTenantConnectionProvider添加数据源_Java_Spring_Multi Tenant - Fatal编程技术网

Java Spring多租户:在添加用户时动态向MultiTenantConnectionProvider添加数据源

Java Spring多租户:在添加用户时动态向MultiTenantConnectionProvider添加数据源,java,spring,multi-tenant,Java,Spring,Multi Tenant,我有一个场景,其中一个用户注册并为他们创建一个新的数据库。注册过程完成后,需要将此数据库添加到MultiTenantConnectionProvider(连接池)中。一切正常,但我无法将数据源动态添加到MultiTenantConnectionProvider 多租户的休眠配置: <property name="hibernateProperties"> <props> <prop key="hi

我有一个场景,其中一个用户注册并为他们创建一个新的数据库。注册过程完成后,需要将此数据库添加到MultiTenantConnectionProvider(连接池)中。一切正常,但我无法将数据源动态添加到MultiTenantConnectionProvider

多租户的休眠配置:

       <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();