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