通过Spring - Hibernate在多个数据库中执行SQL查询

时间:2018-04-09 13:17:24

标签: spring hibernate spring-mvc

我遇到了以下问题,我正在寻找 Spring - MVC和Hibernate 中的解决方案。

问题陈述:有一个UI,它有一个文本区域和提交按钮。在文本区域中,用户可以编写SQL查询,提交后,必须在多个数据库中执行此SQL查询。

注意:假设已经配置了多个数据库。

请告诉我实施它的最佳方法。

2 个答案:

答案 0 :(得分:1)

您可以考虑两个选项:

  1. AbstractRoutingDataSource
  2. 使用此解决方案,您可以在执行查询之前切换到正确的数据库。所以你可以写点像

      // GOLD database
      CustomerContextHolder.setCustomerType(CustomerType.GOLD);
      List<Item> goldItems = catalog.getItems();
      assertEquals(3, goldItems.size());
      System.out.println("gold items: " + goldItems);
    
      // SILVER database
      CustomerContextHolder.setCustomerType(CustomerType.SILVER);
      List<Item> silverItems = catalog.getItems();
      assertEquals(2, silverItems.size());
      System.out.println("silver items: " + silverItems);
    
      // DEFAULT database
      CustomerContextHolder.clearCustomerType();
      List<Item> bronzeItems = catalog.getItems();
      assertEquals(1, bronzeItems.size());
      System.out.println("bronze items: " + bronzeItems);   
    

    以下是一些文档:

    https://spring.io/blog/2007/01/23/dynamic-datasource-routing/

    https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/jdbc/datasource/lookup/AbstractRoutingDataSource.html

    http://fedulov.website/2015/10/14/dynamic-datasource-routing-with-spring/

    1. 使用多个事务管理器(一个按数据库)
    2. 这涉及您事先知道特定服务所需的事务管理器。

      https://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/transaction.html#tx-multiple-tx-mgrs-with-attransactional

答案 1 :(得分:1)

我假设您在应用程序上下文(?)中连接了多个数据源。如果是这样,并假设它们具有不同的限定符,则可以将它们注入另一个组件,通常是从控制器调用或直接调用到控制器中的服务。

@Autowired List<DataSource> datasources;

应该通过构造函数注入来完成技巧。使用后者,您可以为每个DataSource创建一个JdbcTemplate。然后循环遍历列表并对所有数据源执行相同的sql查询。