В нашем приложении мы выполняем большое количество вставок / обновлений (от 1 до 100 КБ), и я заметил, что не все записи сохраняются.Сохраняет от 90% до 95% записей при отключенном безопасном режиме.
Успешное выполнение upset с safemode для всех записей успешно, но слишком медленно.Я помню, как читал где-то, что даже при отключенном безопасном режиме не должно быть никаких причин, по которым обновление / вставка не должны завершаться ошибкой, если сервер недоступен.
Я написал небольшое приложение для проверки этого и включил приведенный ниже код.Он пытается вставить 100 000 вставок в Mongo, и после проверки после запуска я вижу около 90 000 записей в коллекции.
(Примечание: я использую параллельное обновление, так как я обновляю с помощью _id, а Mongo 2.0 поддерживает параллельные операции при использовании _id. Когда не используется Parallel.Foreach, я все еще вижу некоторую потерю записей, хотя и не такую большую)
MongoServer server = MongoServer.Create(host);
MongoDatabase test = server.GetDatabase("testDB");
var list = Enumerable.Range(0, 100000).ToList();
using (server.RequestStart(test))
{
MongoCollection coll = test.GetCollection("testCollection");
Parallel.ForEach(list, i =>
{
var query = new QueryDocument("_id", i);
coll.Update(query, Update.Set("value",100),
UpdateFlags.Upsert, SafeMode.False);;
});
}
Итак, я думаю, что мой вопрос: каков наилучший способ сделать большое количество обновлений быстро, со 100% вероятностью успеха?
Я не могу использовать вставку, потому что у меня естьчисло процессов, пишущих в Mongo, и я не могу быть уверен, существует ли определенный документ или нет, поэтому я использую Upsert.