2012-03-01 55 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