我的应用程序基于 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 + 自定义注释的拦截器,将服务方法连接到所需的数据库。
但是,您可以显式使用数据源开关。


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!