微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

复制的MongoDB + spring-data-mongodb

如何解决复制的MongoDB + spring-data-mongodb

一个复制的mongodb(mongodb-1-主,mongodb-2-辅助,mongodb-3-辅助)。 该应用程序通过spring-boot-starter-data-mongodb运行。

服务:

public class FooBarService {
  private FooBarRepository repository;

  public FooBar method1() {
    return repository.someQuery();
  }
  
  public FooBar method2() {
    return repository.someQuery();
  }
}

存储库:

public interface FooBarRepository extends MongoRepository<FooBar,String> {
  FooBar someQuery();
}

我的问题是,如何使它从mongo副本集中的主要参与者读取方法1,而从mongo副本集中的次要参与者读取方法2呢?

想找到某种在服务级别上进行管理的方法(类似于@Transactional,但要选择mongo副本集成员)。

在这方面,您能为我提供任何解决方案吗?

解决方法

解决方案1:@Meta注释

如果要继续使用存储库接口,可以使用@Meta批注注释查询方法定义,该批注允许您传递标志以指示要从辅助mongodb成员读取。

public interface FooBarRepository extends MongoRepository<FooBar,String> {

  @Query("{}")
  @Meta(flags = Meta.CursorOption.SECONDARY_READS)
  FooBar someQuery();
}

但是您不能从服务级别控制此标志。您将必须创建2个查询方法:一种带有标志,另一种不带有标志。像someQueryFromSecondary()someQueryFromPrimary()

解决方案2:使用MongoTemplate

另一种选择是直接使用MongoTemplate并在Query上设置标志。

public void someQuery(boolean readFromSecondary) {
    var query = Query.query(Criteria.where("someKey").is("1"));

    if (readFromSecondary) {
        query.allowSecondaryReads();
    }

    return mongoTemplate.findOne(query,FooBar.class);
}

无论选择哪种解决方案:请注意,从次要成员那里读取内容可能会导致检索过时的数据。 Consider taking a look at the mongodb docs.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。