如何更喜欢在MongoDb中读取二进制文件

在副本集配置中使用mongodb时(1个仲裁器,1个主要,2个从属); 如何设置读取对辅助节点执行的首选项,并将主节点仅用于写入? 我正在和Morphia一起使用MongoDb 2.0.4。 我看到有一个slaveOk()方法,但我不确定它是如何工作的。

Morphia http://code.google.com/p/morphia/

详细信息 My Mongo设置有以下选项:

 mongo.slaveOk();
 mongo.setWriteConcern(WriteConcern.SAFE);

我试图使用以下(这可能是答案-btw):

数据存储区ds = getDatastore();
查询 query = ds.find(MyEntity.class).field(“entityId”)。equal(entityId);
 query.queryNonPrimary();  //看起来等同于ReadPrefererence.secondary()
 MyEntity entity = query.get();

正确的答案,经过多少血和汗后如下:

  • 优先读取所有读取/查询,只需要设置slaveOk()
  • 要仅选择所选读取使用辅助,请不要设置slaveOk()并使用queryNonPrimary()来代替每个查询

在使用副本集时设置适当的写入问题也是一种很好的做法,如下所示:

  mongo.setWriteConcern(WriteConcern.REPLICAS_SAFE); 

似乎当前的方法(根据Java驱动程序2.8+)是这样做的

MongoOptions options = new MongoOptions(); options.setReadPreference(ReadPreference.secondaryPreferred()); 

然后

 mongo = new com.mongodb.Mongo(Arrays.asList(address1, address2), options); 

这将使所有连接更喜欢使用辅助节点,但如果辅助节点由于某种原因关闭或不可用,则将使用主节点作为备份。

使用“SECONDARY”阅读偏好http://www.mongodb.org/display/DOCS/Read+Preferences+and+Tagging+in+The+Java+Driver

“SECONDARY:从辅助节点读取(如果可用),否则出错。”

对于Java驱动程序3.6,现在是方法

  MongoClientOptions l_opts = MongoClientOptions .builder() .readPreference( ReadPreference.secondary() ) .build(); ServerAddress l_addr = new ServerAddress( "localhost", 27017 ); try ( MongoClient l_conn = new MongoClient( l_addr, l_opts ); ) { ...