首页 > 解决方案 > Spring Boot 多个外部数据源存储在内部数据库中

问题描述

我有一个 spring boot 项目,并且我有一个内部数据库,其中包含 application.properties 上的配置。在这个数据库中,我有一个 Company 表,其中包含与外部数据库的连接信息(所有外部数据库都具有相同的结构)。

我创建了一个在需要时创建数据源的类:

public class PgDataSource {

    private static Map<Long, DataSource> dataSourceMap = new HashMap<>();

    private static void createDataSource(Company company) {
        HikariConfig hikariConfig = new HikariConfig();
        hikariConfig.setMaximumPoolSize(10);
        hikariConfig.setMinimumIdle(1);
        hikariConfig.setJdbcUrl("jdbc:postgresql://"+company.getUrl()+"/"+company.getIdClient());
        hikariConfig.setUsername(company.getUsername());
        hikariConfig.setPassword(company.getPassword());

        dataSourceMap.put(company.getId(), new HikariDataSource(hikariConfig));
    }

    public static DataSource getDataSource(Company company) {
        if (!dataSourceMap.containsKey(company.getId()))
            createDataSource(company);

        return dataSourceMap.get(company.getId());
    }

}

你能告诉我这个解决方案是否是最好的,我是否可以在这个解决方案中使用 JPA?

谢谢

标签: javaspringspring-bootjpa

解决方案


设置的困难不是多个数据源,而是它们是动态的,即在运行时确定的事实。除了DataSourceJPA 使用EntityManagerFactoryTransactionManager,它们是静态确定的,即在编译时。因此,将 JPA 与动态数据源一起使用并不容易。

在 Spring Boot 2 中,您可以尝试AbstractRoutingDataSource,它允许基于某些(线程绑定)上下文将 JPA 调用路由到不同的数据源。这是一个如何使用它的示例和一个演示应用程序。

或者,您可以将设置转换为静态设置,然后使用常规的多数据源方法。缺点是“公司”列表将在编译时固定,因此可能不是您想要的。


推荐阅读