SpringBoot如何为两个spring-data jpa存储库动态创建不同的数据源

时间:2018-12-14 03:54:11

标签: spring spring-boot jpa

我尝试使用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。

0 个答案:

没有答案