我的应用程序基于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中为不同的用例注入不同的实体管理器 .
我认为可以完成的唯一方法是使用自定义实现扩展存储库,该实现使用自定义实体管理器注释相关的persistenceContext,如下所示 .
public interface CustomerRepository extends JpaRepository<Customer, Integer>, MyCustomCustomerRepository{
}
public class MyCustomCustomerRepositoryImpl implements MyCustomCustomerRepository {
@PersistenceContext(unitName = "entityManagerFactoryTwo")
EntityManager entityManager;
}
我想避免做这个自定义实现 . 任何帮助解决这个用例(我觉得应该是非常常见的)将不胜感激 .
注意:两个数据库中的实体都相同,因此为实体扫描提供单独的包,类似的解决方案可能不起作用 .
2 回答
这是一个很好的示例,您可以使用:dynamic-datasource-routing-with-spring . 在里面你可以找到一个AbstractRoutingDatasource拦截器,用于自定义注释,将服务方法连接到所需的数据库 . 但是,您可以只显式使用数据源切换 .
下面是显示差异的pull请求以及我如何使用大多数配置注释驱动而不是xml . 它基于上面的cra6的答案 . 即使用spring的RoutingDataSource功能 .
https://github.com/himanshuvirmani/rest-webservice-sample/pull/1/files