Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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
Mysql Spring boot Multitenance,其中一个租户连接到多个架构_Mysql_Spring_Hibernate_Spring Boot - Fatal编程技术网

Mysql Spring boot Multitenance,其中一个租户连接到多个架构

Mysql Spring boot Multitenance,其中一个租户连接到多个架构,mysql,spring,hibernate,spring-boot,Mysql,Spring,Hibernate,Spring Boot,我正在创建一个spring引导应用程序,它应该支持多租户、独立数据库的方法。每个租户将使用多个模式,并将从某个配置文件中动态加载。租户和模式应该是这样的 租户1: url : dbc:mysql://dns1/abc_schema username : sa password : sa url : dbc:mysql://dns1/pqr_schema username : sa password : sa url : dbc:mysql://dns1/xyz_schema username

我正在创建一个spring引导应用程序,它应该支持多租户、独立数据库的方法。每个租户将使用多个模式,并将从某个配置文件中动态加载。租户和模式应该是这样的

租户1:

url : dbc:mysql://dns1/abc_schema
username : sa
password : sa

url : dbc:mysql://dns1/pqr_schema
username : sa
password : sa

url : dbc:mysql://dns1/xyz_schema
username : sa
password : sa
承租人2:

url : dbc:mysql://dns2/abc_schema
username : sa
password : sa

url : dbc:mysql://dns2/pqr_schema
username : sa
password : sa

url : dbc:mysql://dns2/xyz_schema
username : sa
password : sa
目前它是一个单租户应用程序,其中所有3个模式都在application.properties中提到。所有数据库实例都具有相同的架构名称,但位于不同的数据库实例中。现在,有3个单独的配置文件@configuration用于在应用程序启动时加载表

我正在将此应用程序转换为多租户应用程序。实现多租户应用程序的步骤很清楚,租户只有一个模式,但我有多个租户模式。因此,问题是在实现
AbstractDataSourceBasedMultiTenantConnectionProviderImpl
类时,
selectDataSource()
函数返回单个数据源。但是如何在其中传递多个模式呢

@Override
    protected DataSource selectDataSource(String tenantIdentifier) {
        if (isInitialLoad) {
            isInitialLoad = false;
            TenantDataSource tenantDataSource = context.getBean(TenantDataSource.class);
            map.putAll(tenantDataSource.getAll());
        }
        return map.get(tenantIdentifier);
    } 
提前感谢,,
Schelz

这只是给出的方法,而不是确切的解决方案

定义路由器,如下所示,然后您可以在配置中进行设置

public class ClientDataSourceRouter
  extends AbstractRoutingDataSource {

    @Override
    protected Object determineCurrentLookupKey() {
        return ClientDatabaseContextHolder.getClientDatabase();
    }
}
我们需要一个到数据源对象的上下文映射来配置AbstractRoutingDataSource。如果没有上下文集,我们还可以指定要使用的默认数据源

我们使用的数据源可以来自任何地方,但通常会在运行时创建或使用JNDI查找:

@配置 公共类路由测试配置{

@Bean
public DataSource clientDatasource() {
    Map<Object, Object> targetDataSources = new HashMap<>();
    DataSource clientADatasource = clientADatasource();
    DataSource clientBDatasource = clientBDatasource();
    targetDataSources.put(ClientDatabase.CLIENT_A, 
      clientADatasource);
    targetDataSources.put(ClientDatabase.CLIENT_B, 
      clientBDatasource);

    ClientDataSourceRouter clientRoutingDatasource 
      = new ClientDataSourceRouter();
    clientRoutingDatasource.setTargetDataSources(targetDataSources);
    clientRoutingDatasource.setDefaultTargetDataSource(clientADatasource);
    return clientRoutingDatasource;
}

// ...
租户二

spring.source.second.url=jdbc:postgresql://my_url:my_port/my_other_stuff
spring.source.second.username=my_user_name
spring.source.second.password=my_password
spring.source.second.driver-class-name=org.postgresql.Driver
spring.source.second.schema = B
然后为每个类创建PropertySource类,然后它将由spring设置,之后您可以使用它们

 @ConfigurationProperties(prefix = "datasource.first")
@Bean
@Primary
public DataSource dataSource() {
    return DataSourceBuilder
        .create()
        .build();
}
也请检查此链接

查看此文件,谢谢。
targetDataSources.put(ClientDatabase.CLIENT\u A,clientDataSource)的链接;
,ClientDataSource只能是一个数据源,对吗?但对我来说,客户端A指向3个数据源。是否可以为客户端A提供一个数据源列表?否,因为数据源只意味着一个数据源,这就是为什么他们在运行时将所有数据源映射并设置setTargetDatasources,例如位置更改您可以将数据源设置为另一个数据源,或根据您的场景设置数据源OK,但是一些API调用使用单个租户的两个架构来获得结果。因此,如果我们只连接到一个数据源,如何解决这一问题?实际上,我使用的多租户方法是为每个租户设置单独的数据库。但这只是单个租户在单个RDS实例中获取不同模式的数据。
spring.source.second.url=jdbc:postgresql://my_url:my_port/my_other_stuff
spring.source.second.username=my_user_name
spring.source.second.password=my_password
spring.source.second.driver-class-name=org.postgresql.Driver
spring.source.second.schema = B
 @ConfigurationProperties(prefix = "datasource.first")
@Bean
@Primary
public DataSource dataSource() {
    return DataSourceBuilder
        .create()
        .build();
}