spring - Spring Boot Repository Annotated Interface 中的多个数据源

标签 spring hibernate spring-boot spring-data spring-data-jpa

我的应用程序基于 Spring Boot、Hibernate、MySQL,使用 Spring Data JPA 拼接它们。

用例是使用从数据库节点进行繁重的读取操作,以避免从主 mysql 节点提供所有流量。实现这一点的一种方法是让多个实体管理器指向不同的数据源(一个指向主节点,另一个指向从节点)。在下面的 SO 问题和博客中已经很好地解释了这种方式。

Spring Boot, Spring Data JPA with multiple DataSources

https://scattercode.co.uk/2016/01/05/multiple-databases-with-spring-boot-and-spring-data-jpa/

我陷入困境的地方是了解是否有一种方法可以在我的 Repository Annotated Interface 中为不同的用例注入(inject)不同的实体管理器。

我认为可以完成的唯一方法是使用自定义实现扩展存储库,该实现使用自定义实体管理器,并使用下面的相关 persistenceContext 进行注释。

public interface CustomerRepository extends JpaRepository<Customer, Integer>, MyCustomCustomerRepository{
}

public class MyCustomCustomerRepositoryImpl implements MyCustomCustomerRepository {

        @PersistenceContext(unitName = "entityManagerFactoryTwo")
        EntityManager entityManager;
}

我想避免做这个自定义实现。任何有关解决此用例的帮助(我觉得应该很常见)将不胜感激。

注意:两个数据库中的实体相同,因此为实体扫描和类似解决方案提供单独的包可能不起作用。

最佳答案

这是一个很好的示例,您可以使用:
dynamic-datasource-routing-with-spring .
您可以在里面找到 AbstractRoutingDatasource + 自定义注释的拦截器,将服务方法连接到所需的数据库。
但是,您可以显式使用数据源开关。

关于spring - Spring Boot Repository Annotated Interface 中的多个数据源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39265515/

相关文章:

java - 使用切面时未调用 Spring Boot RestController 的构造函数

hibernate - Spring /hibernate 异常 : createCriteria is not valid without active transaction

java - 使用 Lucene 解析搜索查询并基于该查询构建 Hibernate 标准

java - 有没有办法避免Tomcat中的卸载内存泄漏?

java - 当外部依赖准备就绪时,应用程序启动后初始化 Bean

java - 有没有办法在 spring 中重新加载 Autowiring 实例或替换 Autowiring 行为

sql - Hibernate HQL 相当于 Oracle 并行关键字

java - HTML 未在电子邮件模板上呈现,以文本形式呈现

java - 使用登录端点/Web服务成功登录后,如何发送额外的数据/信息?

spring-boot - 在 Springboot 2.2.6 中找不到 jwt 依赖项