MongoDb Morphia写作关注点

MongoDb Morphia写作关注点,mongodb,morphia,Mongodb,Morphia,我使用的是Java线程进程,在使用MongoDB 3.0(不是sharded)和Morphia时遇到了一些写/更新问题。下面是它的工作原理: 1) 线程更新具有特定“_id”的文档中的某些数据(通过Morphia ODM) 2) 执行document.save()之后,线程A将“\u id”发送到线程B 3) 线程B接收“_id”,查询MongoDB以检索书面文档 有时,线程B接收到“_id”,查询MongoDB,但没有得到文档的更新版本(仍然是旧值) 我认为这是一个值得关注的问题。我已经像这样

我使用的是Java线程进程,在使用MongoDB 3.0(不是sharded)和Morphia时遇到了一些写/更新问题。下面是它的工作原理:

1) 线程更新具有特定“_id”的文档中的某些数据(通过Morphia ODM)

2) 执行document.save()之后,线程A将“\u id”发送到线程B

3) 线程B接收“_id”,查询MongoDB以检索书面文档

有时,线程B接收到“_id”,查询MongoDB,但没有得到文档的更新版本(仍然是旧值)

我认为这是一个值得关注的问题。我已经像这样设置了MongoDB客户端和Morphia数据存储:

    MongoClient mongoClient = new MongoClient(new ServerAddress (host,port),
                                              credential);
    Datastore datastore = morphia.createDatastore(mongoClient, datastoreName);

    // Setting up writeconcern
    WriteConcern wc=new WriteConcern(1,0,false,true);
    datastore.setDefaultWriteConcern(wc);
    mongoClient.setWriteConcern(wc);
有什么我遗漏的吗?在将消息发送到线程B之前,如何真正等待Morphia在MongoDB中更新文档

  • 我想你会希望得到大多数人的关注:
  • 您是否配置了正确的读取首选项
    primary
    primary Preferred
    是您想要的,请参阅

  • PS:我认为您的WriteConcern创建已被弃用:

    否,这些设置用于副本设置OK谢谢。我在一台服务器上只有一个mongodb实例。我已经替换了不推荐的WriteConcern wc=newwriteconcern(1,0,false,true);使用WriteConcern.JOURNALED(但根据WriteConcern类定义,它是完全相同的)使用单个服务器,这非常奇怪。写关注点1保证您的查询已在内存中应用,并应从内存中提供服务。您确定这不是线程问题/您真的在等待在内存中应用第一个查询吗?是的,这很奇怪。我确信线程A在执行数据存储后会将消息发送给线程B;但我不确定Morphia是否真的挂起了我的帖子,直到文档真正“记录在案”