我尝试使用SpringBoot Jpa操作固定的dataSource A和多个dataSources(可能是两个dataSource。也许是三个dataSource,例如B,C,D ...)
同时,dataSource A指向A的spring-data jpa存储库,另一个dataSources指向另一个相同的spring-data jpa存储库。
搜索了很长时间,终于可以使用AbstractRoutingDataSource切换多数据源了。
但是现在的问题是如何为两个jpa存储库动态创建不同的dataSource,一个用于dataSource A,一个用于另一个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
Multiple Data Sources with same entity and repo
https://github.com/wmeints/spring-multi-tenant-demo ...
其中一些只能动态创建多数据源,但是具有相同的jpa存储库。
其中一些可以动态创建多个数据源,但只能使用jdbcTemplate。