Безопасный режим для пакетной вставки - PullRequest
0 голосов
/ 01 марта 2012

Когда я использую безопасный режим (только ведение журнала) для пакетной вставки в изолированном кластере, результат возвращается в виде списка SafeModeResult для драйвера C # (я полагаю, что он аналогичен и для других драйверов). Что означает каждый результат в списке?

Это за элемент в пакете, или за осколок, или за сообщение, отправленное на сервер?

Является ли пакетная вставка атомарной или нет специально в защищенной среде? если нет, как я могу узнать, какая часть моей партии вышла из строя?

Ответы [ 2 ]

5 голосов
/ 03 марта 2012

Метод InsertBatch в драйвере C # фактически пытается отправить все документы на сервер в одном сообщении. Однако существует ограничение на длину сообщения, которое составляет приблизительно 16 МБ. Таким образом, если пакет, который вы предоставляете, InsertBatch очень большой, тогда может понадобиться, чтобы InsertBatch разбил его на подпартии, чтобы не превышать максимальную длину сообщения. Когда это произойдет, вы получите отдельный SafeModeResult для каждого подпакета, но обычно вы ожидаете, что список возвращаемых SafeModeResults будет содержать только один SafeModeResult.

1 голос
/ 01 марта 2012

Это на самом деле не так, как с другими драйверами, и я не могу придумать вескую причину, почему он возвращал бы результат записи на вставку для фактической пакетной вставки, поскольку это противоречит цели / оптимизации пакетной вставки (котораяMongoDB рассматривается как одна операция и поэтому требует только одного вызова getLastError ().

Как работает фактическая пакетная вставка, так это то, что пакетная вставка выполняется MongoDB без драйвера, выполняющего вызов getLastError () для каждой вставки,Это имеет очевидный недостаток: вы не можете видеть, была ли вставка успешной, за исключением последней в пакете (в случае ContinueOnError = false) или если какая-либо из них завершилась неудачно (в случае ContinueOnError = true, в которойслучай, когда фактическая ошибка относится к последней неудачной вставке).

Казалось бы, метод драйвера C # для пакетных вставок, который вы используете, на самом деле является вспомогательным методом, который делает пары insert / getLastError для каждой вставки.Это прекрасно работает и говорит вам, какая именно вставка завершилась неудачно, но, следовательно, это не фактическая пакетная вставка и не использует преимущества оптимизации.

Пакетные вставки не являются атомарными.Это просто оптимизация для уменьшения накладных расходов getLastError ().

...