2013-10-28 70 views
0

我正试图用多个虚拟机实现集中化逻辑。 我有一个应用程序在5个虚拟机上运行。只有1个虚拟机负责完成一项任务。 为了让我将该VM的主机名写入数据库,但要将该名称更新为数据库,必须使用Java客户端API实现锁定,因为同时可能会有2-3个虚拟机出现。 如何实现这一目标?Mongo DB - 锁定收集和插入记录

更新: 我可以使用findandModify。但我的代码看起来像这样

{ 
    if(collection.getCount({"taskName" :"Task1"}) == 0){ 
    //insert record ------ **I can use findAndModify here** 
} 
} 

但是如果两个虚拟机上来的同时,然后将两者如果块里面去,因为文件不可用。
据我所知,findAndModify是原子。因此,在1个虚拟机发出findAndModify命令后,我们将有1个带有主机名的记录。但是下一个虚拟机也会执行相同的操作,并用主机名重新更新记录。

请让我知道,如果我不清楚我的问题。

+0

我有一个词给你:'findAndModify' –

+0

谢谢。我更新了我的问题。请求您检查 –

+0

使用如下所示:'findAndModify({hostname:''},{...})'。这样,第一个虚拟机将设置其主机名,但下一个将无法找到一个文件(因为现在主机名不是空的) –

回答

0

mongodb中的每个文档的更新都是原子的。所以你不必在客户端实现锁定机制。正如评论状态检查here为您的用例。

更新

在查询部分,你可以检查文档具有“主机名”与$exists。如果具有Task1的文档具有主机名,则表示已有一个虚拟机负责该任务。我不知道你的整个用例,但可以说,VM1已完成任务,它可以更新文档以删除字段“主机名”。或者你可以为主机名使用一个默认值如'',并检查主机名是否与''和任务名与'任务1'。

+0

谢谢。我更新了我的问题。请求您检查 –