SpringBoot, как динамически создавать разные источники данных для двух jpa-репозиториев spring-data - PullRequest
0 голосов
/ 14 декабря 2018

Я пытаюсь использовать 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...