2013-10-28 73 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

謝謝。我更新了我的問題。請求您檢查 –