我是MongoDB的新手。我创建了一个使用MongoDB作为数据库的Java应用程序。我在一个副本集中配置了3台服务器。我的伪代码:{
createUser getUser updateUser
}
在这里,createUser成功地创建了用户,但getUser有时无法返回该用户。
当我分析时,它是由于数据复制延迟。
我如何克服这个问题?
有没有办法在创建数据时立即复制数据?
有没有其他方法可以不失败地获得用户?
提前谢谢你!
发布于 2012-06-14 02:55:22
如果您确定问题是由复制延迟引起的,那么您可以做的一件事是确保您的写入是安全的,并使用w标志。这样,MongoDB将等待数据至少复制到n节点,然后才返回。您也可以从客户端驱动程序中执行此操作。
MongoDB getLastError
你在和slaveOk=True一起读书吗?如果您从ReplicaSet主节点读取,这也不是问题。
发布于 2012-08-24 13:59:44
在较新的Mongo Java驱动程序版本中,slaveOk属性现在称为ReadPreference (在本例中为.SECONDARY)。这可以在Mongo/DB/Collection级别设置。请注意,当您在这些级别设置ReadPreference时,它将应用于所有调用者(即这些对象在线程之间共享)。
另一种方法是尝试ReadPreference.SECONDARY,如果失败,尝试不使用它并转到主服务器。此逻辑可以隔离到您的存储库层,因此服务层不必处理它。如果要执行此操作,则可能需要在DBQuery对象上设置ReadPreference,这是基于每次使用进行设置的。
发布于 2013-03-03 06:30:59
我不熟悉Java驱动程序,但有w和j选项。
W选项确认写入操作已复制到指定数量的副本集成员,包括主副本集成员。
J将仅在其已将该操作写入日志之后才确认该写入操作。
看起来您需要使用WriteConcern。
https://stackoverflow.com/questions/6544813
复制相似问题