动态数据源作为 Spring Boot + Hibernate 中的第二个数据源
Posted
技术标签:
【中文标题】动态数据源作为 Spring Boot + Hibernate 中的第二个数据源【英文标题】:Dynamic datasource as second datasource in Spring Boot + Hibernate 【发布时间】:2017-06-24 13:25:50 【问题描述】:我有一个关于如何在 Spring Boot 应用程序中处理两个不同数据源的问题。
用例:
我有一个必须始终连接的主存储库 (db) (应用范围),我没有问题,有 TransactionManager 和 EntityManager。
第二个数据库连接应该只在请求范围内,使用 从 httpRequest 收集的动态凭据。
数据源均来自 PostgreSQL。
这可能吗?如果是,那么实现这一目标的最佳方法是什么。
感谢您的帮助。
【问题讨论】:
【参考方案1】:这是两个数据源模式的有趣转折!
您的第二个数据源必须根据应用程序外部的信息进行解析,因此您将无法使用 Spring 应用程序上下文。
您可以在 Spring 中以编程方式配置数据源,本问答中对此进行了介绍:
Configure DataSource programmatically in Spring Boot
您的情况略有不同,因为凭据将在运行时解析,但可以使用相同的想法。
-
确保您具有 Spring JDBC 依赖项。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
-
使用 DataSourceBuilder,使用您的凭据构造一个新的 DataSource 对象
public DataSource getDataSource(String user, String password)
DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
dataSourceBuilder.url(DBB_URL);
dataSourceBuilder.username(user);
dataSourceBuilder.password(password);
return dataSourceBuilder.build();
然后将其用作代码的数据源。您将无法自动装配它,因此您将提出一个合理的策略,用于何时在 JDBC 方法中构造数据源并将其与 Spring JdbcTemplate 一起使用,以允许您正在寻找的事务完整性为了。
还有其他您未指定的注意事项。此策略假定您对两个数据源使用相同的 JDBC 驱动程序。如果您使用不同的数据库,则必须为这些库添加依赖项,然后为动态数据源指定驱动程序类。
【讨论】:
以上是关于动态数据源作为 Spring Boot + Hibernate 中的第二个数据源的主要内容,如果未能解决你的问题,请参考以下文章
实战,Spring Boot整合GraphQL实现动态字段接口!
43. Spring Boot动态数据源(多数据源自动切换)从零开始学Spring Boot