Mysql Spring boot Multitenance,其中一个租户连接到多个架构
我正在创建一个spring引导应用程序,它应该支持多租户、独立数据库的方法。每个租户将使用多个模式,并将从某个配置文件中动态加载。租户和模式应该是这样的 租户1: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
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();
}