как сохранить документ / запись mongodb с самостоятельно сгенерированным _id в сценарии с несколькими потоками - PullRequest
0 голосов
/ 11 июля 2019

Я использовал mongodb в сценарии со многими потоками, которые могут вставлять / обновлять документ / запись в DB。_id создается путем объединения полей среди всех, которые должны быть вставлены или обновлены в соответствии с документом, идентифицированным _id. Я использовал код Java, как показано ниже. Я ожидал, что в сценарии с несколькими потоками, если запись / документ не существует, любой поток может вставить новую запись / документ с _id и конкретными столбцами / полями для потока, после того как запись станет доступной, любой поток может обновить свои специфичные для потока столбцы / поля. Но в тесте, если запись уже доступна, об ошибке будет сообщено, если дублированный _id уже доступен, но я установил _id в Filter, а не в документе, чтобы установить. Чтобы решить эту проблему, я должен либо добавить распределенную блокировку (redis), либо перехватить дублирующееся исключение _id и обновить его, если для параметра upsert установлено значение false, но любой из этих двух параметров не такой аккуратный и чистый, и оба имеют серьезное влияние на производительность более 100 мс. Любой специалист по mongodb может помочь мне с этим?

String rkValue = (String) newObjFromRow;
Bson rkFilter = Filters.eq(rkName, rkValue);
Document document = MyMongoRow.toDocument(row, groupByGuidTsList, groupByGuidTsIndexList);
Document wrappedUpdate = new Document();
wrappedUpdate.put("$set", updateDoc);
updateOneDocWNCompare(rkFilter, MongodbConstants.methodSetOnInsert, document, true);
UpdateOptions options = new UpdateOptions();
options.upsert(true);
collection.updateOne(rkFilter, wrappedUpdate, options);

1 Ответ

0 голосов
/ 11 июля 2019

Кажется, что это как-то желаемое поведение, если вы проверите

https://jira.mongodb.org/browse/SERVER-20380

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

...