From 267cbbbff2a9495ecb28a269faf73d5e8415b633 Mon Sep 17 00:00:00 2001 From: box <1281956265@qq.com> Date: Fri, 26 Jul 2024 14:31:40 +0800 Subject: [PATCH] =?UTF-8?q?perf[orm]:=20for=E5=BE=AA=E7=8E=AF=E8=A7=A3?= =?UTF-8?q?=E5=86=B3=E5=88=86=E5=B8=83=E5=BC=8Fid=E7=94=9F=E6=88=90?= =?UTF-8?q?=E5=99=A8=E5=88=9B=E5=BB=BA=E6=97=B6duplicate=20key=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/zfoo/orm/util/MongoIdUtils.java | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/orm/src/main/java/com/zfoo/orm/util/MongoIdUtils.java b/orm/src/main/java/com/zfoo/orm/util/MongoIdUtils.java index bcc429d9..69b944b7 100644 --- a/orm/src/main/java/com/zfoo/orm/util/MongoIdUtils.java +++ b/orm/src/main/java/com/zfoo/orm/util/MongoIdUtils.java @@ -22,6 +22,8 @@ import com.zfoo.protocol.util.AssertionUtils; import com.zfoo.protocol.util.StringUtils; import org.bson.Document; import org.bson.conversions.Bson; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.function.Consumer; @@ -32,6 +34,8 @@ import java.util.function.Consumer; */ public abstract class MongoIdUtils { + private static final Logger logger = LoggerFactory.getLogger(MongoIdUtils.class); + private static final long INIT_ID = 1L; private static final String COLLECTION_NAME = "uuid"; @@ -57,9 +61,18 @@ public abstract class MongoIdUtils { Document inc = new Document("$inc", new Document(COUNT, 1L)); Document setOnInsert = new Document("$setOnInsert", new Document("_id", documentName)); - var document = collection.findOneAndUpdate(query, Updates.combine(inc, setOnInsert), new FindOneAndUpdateOptions().upsert(true)); - return null == document ? INIT_ID : document.getLong(COUNT) + 1; + // 报错后重试获取id,在大并发create这个key的时候mongodb总是会报错一次“duplicate key error!” 所以重试一次 + for (int i = 0; i < 2; i++) { + try { + var document = collection.findOneAndUpdate(query, Updates.combine(inc, setOnInsert), new FindOneAndUpdateOptions().upsert(true)); + return null == document ? INIT_ID : document.getLong(COUNT) + 1; + } catch (Throwable throwable) { + logger.info("getIncrementIdFromMongo error! retry! ", throwable); + } + } + + throw new RuntimeException("getIncrementIdFromMongo error!"); } public static long getIncrementIdFromMongoDefault(String documentName) {