mongodb: должен ли я всегда использовать опцию «safe» в обновлениях - PullRequest
10 голосов
/ 12 февраля 2011

при работе с mongodb, когда я должен использовать {safe: true} в запросах?

Сейчас я использую опцию «безопасно», чтобы проверить, были ли мои запросы вставлены или успешно обновлены. Тем не менее, я чувствую, что это может быть слишком убить.

Если я предположу, что в 99% случаев мои запросы (при условии, что они правильно написаны) будут вставлены / обновлены, не нужно беспокоиться о проверке, успешно ли они введены?

мысли

Ответы [ 3 ]

26 голосов
/ 12 февраля 2011

Предполагая, что когда вы говорите запросы, вы на самом деле имеете в виду запись / вставку (формулировка вашего вопроса заставляет меня так думать), тогда запись Concern (safe, none, fsync и т. Д.) Может использоваться для увеличения скорости и меньшей безопасности, когдаприемлемо, и меньше скорости и большей безопасности, когда это необходимо.

Например, гипотетическое приложение в стиле Facebook может использовать небезопасную запись для «Likes», в то время как оно будет использовать очень безопасную запись для смены пароля,Логика заключается в том, что в секунду будет происходить много тысяч обновлений в стиле «Мне нравится», и не имеет значения, если оно потеряно, тогда как обновления пароля происходят реже, но важно, чтобы они были успешными.

Поэтому постарайтесь адаптировать свой выбор «Записать озабоченность» к типу обновления, которое вы делаете, исходя из ваших требований к скорости и целостности данных.

6 голосов
/ 12 февраля 2011

Вот еще один вариант использования, когда небезопасные записи являются подходящим выбором: вы делаете большое количество записей в очень короткие сроки.В этом случае вы можете выполнить несколько операций записи, а затем вызвать функцию 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()

Если этот блок выполняется без исключений, то все данные были вставлены успешно,Если возникла исключительная ситуация, то одна или несколько операций записи завершились неудачно, и вам нужно будет повторить их (или проверить наличие нарушения уникального индекса и т. Д.).В реальной жизни вы можете вызывать getLastError каждые 10 записей или около того, чтобы избежать повторной отправки большого количества запросов.

Этот шаблон очень хорош для производительности при выполнении массовых вставок больших объемов данных.

2 голосов
/ 12 февраля 2011

Сейф необходим только при записи, а не при чтении.Запросы только для чтения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...