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

时间:2013-01-29 16:23:41

标签: java mongodb replication morphia

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

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

详细的 我的Mongo设置了以下选项:

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

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

Datastore ds = getDatastore();
Query<MyEntity> query = ds.find(MyEntity.class).field("entityId").equal(entityId);
query.queryNonPrimary(); // appears equivalent to ReadPrefererence.secondary()
MyEntity entity = query.get();

4 个答案:

答案 0 :(得分:6)

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

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

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

mongo.setWriteConcern(WriteConcern.REPLICAS_SAFE);

答案 1 :(得分:2)

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

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

然后

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

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

答案 2 :(得分:0)

使用“SECONDARY”读取首选项 http://www.mongodb.org/display/DOCS/Read+Preferences+and+Tagging+in+The+Java+Driver

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

答案 3 :(得分:0)

对于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 );
    )
    {
       ...