如何解决复制的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 举报,一经查实,本站将立刻删除。