2011-02-11 20 views
10

,何時應該在查詢中使用{safe:true}?mongodb:我應該在處理mongodb時總是使用'​​safe'選項更新

現在我使用「安全」選項來檢查我的查詢是否已成功插入或更新。但是,我覺得這可能是過度殺戮。

我應該假設99%的時間,我的查詢(假設他們被正確書寫)將被插入/更新,而不必擔心檢查他們是否成功輸入?

想法?

回答

24

假設當你說查詢你實際上是寫/插入(你的問題的措辭使我想到這一點),那麼寫關注(安全,無,fsync等)可以用來獲得更多的速度和更少的安全性這是可以接受的,並且在必要時減少速度並提高安全性。

舉個例子,一個假設的Facebook風格的應用程序可以使用一個不安全的寫作「喜歡」,而它會使用非常安全的寫入來更改密碼。這背後的邏輯是,會有數千次「Like」風格的更新發生在第二位,並且丟失的信息並不重要,而密碼更新發生的頻率較低,但它們必須成功。

因此,根據您的速度和數據完整性要求,嘗試根據您正在進行的更新來定製Write Concern選項。

2

只有在寫入時才需要安全,而不是讀取。查詢只能讀取。

6

這是另一個用例,其中不安全的寫入是一個合適的選擇:您正在以很短的順序進行大量寫入。在這種情況下,您可能會執行一些寫操作,然後調用get last error來查看是否有任何失敗。

collection.setWriteConcern(WriteConcern.NORMAL) 
collection.getDB().resetError() 
List< 
for (Something data : importData) { 
    collection.insert(makeDBObject(data)) 
} 
collection.getDB().getLastError(WriteConcern.REPLICAS_SAFE).throwOnError() 

如果此塊成功,沒有異常,則所有的數據被成功地插入。如果發生異常,則一個或多個寫入操作失敗,您需要重試它們(或檢查唯一的索引違規等)。在現實生活中,您可能會每10次寫一次或多次調用getLastError,以避免重新提交大量請求。

在執行大量數據的批量插入時,此模式對性能非常好。

+0

由於錯誤必須異步返回,您如何知道您已經等待足夠長的時間以便發生任何錯誤? – Leopd 2012-12-13 20:44:50