首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >复制MongoDB + spring-data-mongodb

复制MongoDB + spring-data-mongodb
EN

Stack Overflow用户
提问于 2020-11-12 23:42:28
回答 1查看 310关注 0票数 0

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

服务:

代码语言:javascript
复制
public class FooBarService {
  private FooBarRepository repository;

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

存储库:

代码语言:javascript
复制
public interface FooBarRepository extends MongoRepository<FooBar, String> {
  FooBar someQuery();
}

我的问题是,让method1从mongo副本集的主要参与者读取,而method2从mongo副本集的次要参与者读取,这样做有多好?

我想找到一些方法来管理这在服务级别(类似于@Transactional,但选择一个mongo副本集成员)。

在这方面,你能给我一些建议吗?

EN

回答 1

Stack Overflow用户

发布于 2020-11-13 02:51:41

解决方案1:@Meta注解

如果您想继续使用Repository Interfaces,您可以使用@Meta注释来注释query方法定义,该注释允许您传递标志以指示从辅助mongodb成员读取。

代码语言:javascript
复制
public interface FooBarRepository extends MongoRepository<FooBar, String> {

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

但您不能从服务级别控制此标志。您必须创建两个查询方法:一个带有标志,另一个没有标志。比如someQueryFromSecondary()someQueryFromPrimary()

解决方案2:使用MongoTemplate

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

代码语言:javascript
复制
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.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64807071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档