gpt4 book ai didi

java - 尽管没有重叠,但 Mongo DuplicateKey 错误

转载 作者:行者123 更新时间:2023-11-29 08:54:06 26 4
gpt4 key购买 nike

我在 F5 负载平衡器(专业管理,它不会向 >1 主机发送流量)后面有一个日志记录良好的几个 java 服务器池,该服务器运行 Tomcat 并安装了我的应用程序,连接到一个分片的 mongo 集群。我使用主自然键的 base64 编码的 SHA-1 哈希作为 _id。当要创建新记录时,我会做一个非常基本的操作:

BasicDBObject query = new BasicDBObject();
query.put("userId", userId);
query.put("_id", id);
DBObject user = getUsersCollection().findOne(query);

if (user == null) {
getUsersCollection().insert(new UserObject(userId));
}

这是简化的。事实上,对该用户的预先存在进行了多项检查,包括一个应该抛出自定义异常的检查,但没有一个被触发。流量日志指示一个单个传入的创建请求,下面是发生的情况的示例:

2014-01-19 20:03:45,167  [http-bio-7950-exec-827]:[...] : ERROR FATAL [...] - Internal server error
[...]: com.mongodb.MongoException$DuplicateKey: { "serverUsed" : "[...]" , "singleShard" : "replicaset_2/host1:27017,host2:27017,host3:27017" , "err" : "E11000 duplicate key error index: Users.$_id_ dup key: { : \"HASH\" }" , "code" : 11000 , "n" : 0 , "lastOp" : { "$ts" : 1390190614 , "$inc" : 1} , "connectionId" : 335764 , "ok" : 1.0}

但在我的用户集合中,记录已创建:

db.Users.findOne({_id:"HASH"}):

{
"_id" : "HASH",
"createDate" : ISODate("2014-01-20T04:03:45.161Z"),
...
}

由于时间戳,我将其粘贴为重要内容。我们有一个时区问题,但除此之外,我将 6ms 的差异解释为 mongo 集群和我的应用程序服务器之间的时钟偏差。没有关于此传入流量的其他记录(它在从一个服务器跳到另一个服务器时被记录下来,甚至 - 没有别的!)所以我有 99.999% 的信心我的单一合法插入调用既插入又抛出错误。

任何关于这种情况如何/为什么发生的理论将不胜感激。如果需要使用更多信息回答问题,我将运行跟踪器和示例。

最佳答案

您正在使用 _iduserId 字段搜索用户。尝试注释掉这一行:query.put("_id", id);

在您的代码中不清楚 Java 变量 userId 的来源。如果有的话,UserObject 如何设置 _id 也不清楚。

总体而言,您搜索用户的方式与创建用户的方式不匹配,即定义该用户的唯一键的方式。

一个修复可以替换这些行:

query.put("userId", userId);
query.put("_id", id);

与:

query.put("_id", userId);

_id 字段成为您的 userId

关于java - 尽管没有重叠,但 Mongo DuplicateKey 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21243136/

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