spring引导多租户,其中一个租户连接到多个模式

eqqqjvef  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(379)

我正在创建一个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

目前它是一个单租户应用程序,其中application.properties中提到了所有3个模式。所有数据库示例都有相同的模式名,但在不同的数据库示例中。现在,有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);
    }

先谢谢你,谢尔兹

9gm1akwq

9gm1akwq1#

这只是给出的方法,不完全是解决方案
定义路由器,如下所示,然后您可以在配置中设置

public class ClientDataSourceRouter
  extends AbstractRoutingDataSource {

    @Override
    protected Object determineCurrentLookupKey() {
        return ClientDatabaseContextHolder.getClientDatabase();
    }
}

我们需要一个到数据源对象的上下文Map来配置abstractroutingdatasource。如果没有上下文集,我们还可以指定要使用的默认数据源。
我们使用的数据源可以来自任何地方,但通常会在运行时创建或使用jndi查找:
@Configuration 公共类routingtestconfiguration{

@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;
}

// ...

}
查看更多信息-baeldung
另一种解决方案定义如下
多租户模型在应用程序中实现多租户有几种模型:
每个租户的数据库每个租户都有自己的数据库,并与其他租户隔离。
共享数据库,单独的模式(这就是我们要找的)
所有租户共享一个数据库,但有自己的数据库模式和表。
共享数据库,共享模式所有租户共享一个数据库和表。每个表都有一个带有租户标识符的列,该列显示行的所有者。
例子:

@Bean
    public DataSource dataSource() {

        AbstractRoutingDataSource dataSource = new TenantAwareRoutingSource();

        Map<Object,Object> targetDataSources = new HashMap<>();

        targetDataSources.put("TenantOne", tenantOne());
        targetDataSources.put("TenantTwo", tenantTwo());

        dataSource.setTargetDataSources(targetDataSources);

        dataSource.afterPropertiesSet();

        return dataSource;
    }

    public DataSource tenantOne() {

        HikariDataSource dataSource = new HikariDataSource();

        dataSource.setInitializationFailTimeout(0);
        dataSource.setMaximumPoolSize(5);
        dataSource.setDataSourceClassName("org.postgresql.ds.PGSimpleDataSource");
        dataSource.addDataSourceProperty("url", "jdbc:postgresql://127.0.0.1:5432/sampledb");
        dataSource.addDataSourceProperty("user", "philipp");
        dataSource.addDataSourceProperty("password", "test_pwd");

**we need to find datasource.setschema is exist or not**

        return dataSource;
    }

    public DataSource tenantTwo() {

        HikariDataSource dataSource = new HikariDataSource();

        dataSource.setInitializationFailTimeout(0);
        dataSource.setMaximumPoolSize(5);
        dataSource.setDataSourceClassName("org.postgresql.ds.PGSimpleDataSource");
        dataSource.addDataSourceProperty("url", "jdbc:postgresql://127.0.0.1:5432/sampledb1");
        dataSource.addDataSourceProperty("user", "philipp");
        dataSource.addDataSourceProperty("password", "test_pwd");

**we need to find datasource.setschema is exist or not**

        return dataSource;
    }

或者只有一个选择也存在
租户一

spring.datasource.first.url=jdbc:postgresql://my_url:my_port/my_other_stuff
spring.datasource.first.username=my_user_name
spring.datasource.first.password=my_password
spring.datasource.first.driver-class-name=org.postgresql.Driver
spring.datasource.first.schema=A

租户二

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

选中此链接并在此处输入链接描述

相关问题