2012-03-01 60 views
0

當我在一個分片集羣上的批量插入使用安全模式(僅日記)安全模式,結果回來爲SafeModeResult對C#驅動程序列表(我認爲這是對其他司機也類似) 。列表中的每個結果意味着什麼?用於批量插入

是不是每件該批次還是每碎片或者是每發送到服務器的消息?

批量插入原子或不是特別在分片環境?如果沒有,我怎麼知道我的批次哪部分失敗?

回答

5

在C#驅動程序InsertBatch方法做,其實企圖所有的文件發送到服務器的一個消息。但是,消息長度有限,大約爲16MB。因此,如果您提供的InsertBatch批量非常大,則InsertBatch可能必須將其分解爲子批次,以便不超過最大消息長度。發生這種情況時,您將爲每個子批次獲得單獨的SafeModeResult,但通常您會希望返回的SafeModeResults的列表僅包含一個SafeModeResult。

+0

分批處理大約4MB解決了我的問題,但C#驅動程序的性能很慢 – Kuroro 2012-09-21 16:08:39

1

這實際上不是它是如何與其他司機,並因爲這違背了批插入的目的/優化我想不出一個很好的理由,爲什麼它會每個刀片返回寫結果的實際批量插入(這被MongoDB視爲一個操作,因此只需要一次getLastError()調用)。

實際批量插入的工作原理是,批量插入由MongoDB中不執行每個刀片一個GetLastError函數()調用驅動程序執行。這有一個明顯的缺點,除了批處理中的最後一個(在ContinueOnError = false的情況下),或者它們中的任何一個失敗之後(除非ContinueOnError = true,否則您無法看到插入是否成功)如果實際錯誤與上次失敗的插入有關)。

這似乎是爲你使用批量插入的C#驅動程序的方法其實是一個便捷方法,它確實爲每個刀片做插入/ GetLastError函數對。這工作得很好,並告訴你究竟哪個插入失敗,但它不是一個實際的批量插入,並沒有利用優化。

批插入不是原子的。它們只是一個優化來減少getLastError()開銷。

+0

你是說服務器插入批處理可能會失敗一個項目中間沒有告訴我們,因爲它只報告最後一個項目。這似乎是非常危險的地方,我永遠不會相信我的完整批次是否已經插入。我是否明白你的觀點? – iCode 2012-03-02 05:50:44

+1

不,如果它在中間失敗並且ContinueOnError = false,那麼它將停止,因爲失敗的項目將是最後一個項目並且與該項目有關的錯誤。 – 2012-03-02 10:30:13