0

我正在尝试使用多个 VM 实现集中化逻辑。我有一个应用程序在说 5 个虚拟机上运行。只有 1 个 VM 将负责执行一项任务。为此,我正在将该 VM 的主机名写入数据库。但是要将该名称更新到数据库,我必须使用 java 客户端 API 实现锁定,因为可能有 2-3 个 VM 同时出现。如何做到这一点?

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

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

但是如果两个虚拟机同时出现,那么两个虚拟机都会进入 if block,因为文档不可用。
我知道 findAndModify 是原子的。因此,在 1 个 VM 发出 findAndModify 命令后,我们将拥有 1 条带有主机名的记录。但是下一个 VM 也将执行相同的操作并使用其主机名再次更新记录。

如果我不清楚我的问题,请告诉我。

4

1 回答 1

0

mongodb 中每个文档的更新是原子的。因此,您不必在客户端实现锁定机制。正如评论所述,请在此处检查您的用例。

更新

在查询部分,您可以使用$exists检查文档是否具有“主机名” 。如果带有 Task1 的文档有主机名,这意味着已经有一个 VM 负责该任务。我不知道您的整个用例,但可以说,VM1 完成了它可以更新文档以删除字段“主机名”的任务。或者,您可以为主机名使用默认值,例如 '',并检查主机名是否带有 '' 和 taskName 是否带有 'Task1'。

于 2013-10-28T16:52:44.113 回答