gpt4 book ai didi

java - 如何在多线程场景中使用自行生成的_id更新插入mongodb文档/记录

转载 作者:行者123 更新时间:2023-12-02 03:12:39 24 4
gpt4 key购买 nike

我在一个有很多线程的场景中使用了mongodb,可以插入/更新数据库中的文档/记录。_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);

最佳答案

如果您检查,这似乎是某种期望的行为

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

因此,要解决这个问题,要么引入同步(甚至分布式同步),要么在出错时重试更新插入尝试。

关于java - 如何在多线程场景中使用自行生成的_id更新插入mongodb文档/记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56983735/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com