Это просто данный подход, не совсем решение
Определите маршрутизатор, как показано ниже, после этого вы можете установить его в конфигурации
public class ClientDataSourceRouter
extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return ClientDatabaseContextHolder.getClientDatabase();
}
}
Нам нужна Карта контекстов для объектов DataSource для настройки нашего 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 для каждого, и тогда он будет установлен весной, и после этого вы сможете использовать их
@ConfigurationProperties(prefix = "datasource.first")
@Bean
@Primary
public DataSource dataSource() {
return DataSourceBuilder
.create()
.build();
}
проверьте также эту ссылку
введите описание ссылки здесь