Я пытаюсь использовать SpringBoot Jpa для работы с фиксированным источником данных A и несколькими источниками данных (возможно, двумя источниками данных. Может быть, тремя источниками данных, такими как B, C, D ...)
Между тем, источник данных A указывает нахранилище JPA Spring-data, другие источники данных указывают на другое хранилище JPA Spring-data.
Долгое время гуглил, наконец я могу использовать AbstractRoutingDataSource для переключения нескольких источников данных.
Но теперь вопрос в том, как динамически создавать разные источники данных для двух репозиториев jpa, один для dataSourceА, один для другого источника данных?
application.properties
spring.jpa.database=mysql
spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jackson.serialization.indent-output=true
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/message
spring.datasource.username=
spring.datasource.password=
meta.datasource.names=az1,az2
meta.datasource.az1.driver-class-name=com.mysql.jdbc.Driver
meta.datasource.az1.url=jdbc:mysql://localhost:3306/meta1
meta.datasource.az1.username=
meta.datasource.az1.password=
meta.datasource.az2.driver-class-name=com.mysql.jdbc.Driver
meta.datasource.az2.url=jdbc:mysql://localhost:3306/meta2
meta.datasource.az2.username=
meta.datasource.az2.password=
AbstractRoutingDataSource
public class DataSourceRouter extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
System.out.println("DataSourceRouter = " + DataSourceContext.get());
return DataSourceContext.get();
}
}
ThreadLocal делает его поточно-ориентированным
public class DataSourceContext {
private static final ThreadLocal<Object> context = new ThreadLocal<>();
public static void set(Object key) {
System.out.println("DataSourceContext.set = " + key);
context.set(key);
}
public static Object get() {
System.out.println("DataSourceContext.get = " + context.get());
return context.get();
}
public static void clear() {
System.out.println("DataSourceContext.clear");
context.remove();
}
}
Я ссылаюсь на эти статьи, но все это не может решить мою проблему.
http://kimrudolph.de/blog/spring-datasource-routing
https://www.endpoint.com/blog/2016/11/16/connect-multiple-jpa-repositories-using
Несколько источников данных с одной и той же сущностью и репо
https://github.com/wmeints/spring-multi-tenant-demo ...
Некоторые из них могут толькодинамическое создание нескольких источников данных, но с тем же репозиторием jpa.
Некоторые из них могут динамически создавать несколько источников данных, но могут использовать только jdbcTemplate.