java - MyBatis - 在同一服务调用中连接到多个数据库

标签 java guice mybatis

我需要连接到多个数据库来查询和整合数据,然后再将数据返回给用户。有没有办法使用 MyBatis 和 cdi 来做到这一点?我研究过使用 DatabaseIdProvider并具有 multiple environment configurations但看起来它们不适用于这种情况。通过多个环境配置,我可以创建不同的 sql session 工厂,但在这种情况下映射器的 cdi 将如何工作?我想尽可能多地使用cdi。 MyBatis Guice 会对此提供帮助吗?我看过similar问题,但我无法确定 Guice 在这种情况下是否有帮助,因为我需要在同一个服务调用中查询多个数据库。

最佳答案

您将需要定义 2 个 SqlSessionFactories。单独的环境可能会满足您的需求,但也可以使用完全单独的配置和对象/类层次结构。无论如何,您可以根据需要在映射器或映射器扫描仪的配置中传递每一项。

请参阅documentation配置映射器的各种方法。请注意,如果需要,所有这些都允许您指定 SqlSessionFactory。如果每个配置都使用相同的映射器,您可能无法使用扫描仪方法,因为我认为这将为来自不同 SqlSessionFactories 的映射器使用相同的名称。在这种情况下,您将必须为不同的配置使用不同的名称来手动配置映射器。

然后在您的服务中您可以执行以下操作:

public class FooServiceImpl implements FooService {
  @Autowired
  @Qualifier("fooMapperDB1")
  private FooMapper fooMapper1;

  @Autowired
  @Qualifier("fooMapperDB2")
  private FooMapper fooMapper2;

  public List<Foo> doService(String id) {
    List<Foo> toReturn = new ArrayList<>();
    toReturn.add(fooMapper1.getFoo());
    toReturn.add(fooMapper2.getFoo());
    return toReturn;
  }
}

请注意,您在处理交易时需要小心。您可能希望该服务是事务性的,然后对两个数据库连接使用分布式 XA 数据源。

关于java - MyBatis - 在同一服务调用中连接到多个数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40520932/

相关文章:

java - SharedPreferences 被随机删除

java - 文件路径的 Ant Propertyregex 部分

java - Shiro 路径模式排除

java - Google Guice 中的条件匹配

java - MyBatis 性能 - 访问映射器

mybatis 和 ibatis 不支持 jdbcType=BIGDECIMAL

java - MyBatis @Update 与 foreach 的问题

java - 第 K 个元素 N*N 和 vector

java - 在 JDialog 的展示中绘制动画

java - 如何在 gerrit 插件中使用 LifecycleListener?