java - 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?
谢谢
解决方案
设置的困难不是多个数据源,而是它们是动态的,即在运行时确定的事实。除了DataSource
JPA 使用EntityManagerFactory
和TransactionManager
,它们是静态确定的,即在编译时。因此,将 JPA 与动态数据源一起使用并不容易。
在 Spring Boot 2 中,您可以尝试AbstractRoutingDataSource,它允许基于某些(线程绑定)上下文将 JPA 调用路由到不同的数据源。这是一个如何使用它的示例和一个演示应用程序。
或者,您可以将设置转换为静态设置,然后使用常规的多数据源方法。缺点是“公司”列表将在编译时固定,因此可能不是您想要的。
推荐阅读
- android - ListPopupWindow 水平定位错误
- jquery - Shopify Liquid:如何将 Google 地址 url 呈现到 Google 地图中
- php - 所有流行的 Symfony 3 捆绑包都与 Symfony 4 兼容吗?
- java - 将 BIT DATA 转换为字符串 Java
- c# - 使用 c# 在 XML 中的特定位置附加
- android - 奥利奥通知频道听起来不工作
- html - 在实时预览时单击浏览器中的元素时突出显示 HTML 代码
- entity-framework - 如何在实体框架中编写通用查询?
- angularjs - 我如何以角度动态化我的 Flash 消息。消息必须来自 API 响应
- python - 根据公共键对熊猫数据框进行分组