【问题标题】:java mongodb driver no exception thrown on duplicate keysjava mongodb驱动在重复键上没有抛出异常
【发布时间】:2015-02-24 00:23:45
【问题描述】:

我正在使用 spring frameworkmongoTemplate。 bean 启动:

public
@Bean
MongoTemplate mongoTemplate() throws Exception {
    MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory());
    mongoTemplate.setWriteResultChecking(WriteResultChecking.EXCEPTION);

    return mongoTemplate;
}

简而言之,此代码不会因重复键而失败

collection= mTemplate.getCollection("col");
try {
        final WriteResult writeResult = collection.insert(edge);

} catch (DuplicateKeyException e) {
        log.warn("@error> edge already exists");

        return null;
}

writeResult._lastErrorResult 不为空且有相关错误。

我要插入的文档: 我也试图抓住Exception e,但没有成功。

collection.createIndex(new BasicDBObject("a", 1).append(, 1), unique);
DbObject edge = new BasicDBObject("a", "123").append("b", "345");

【问题讨论】:

  • 请发布您尝试插入的文档以及具有相关 ID 的集合快照。
  • 更新问题,谢谢
  • 尝试将 WriteConcern 设置为 SAFE.api.mongodb.org/java/current/com/mongodb/WriteConcern.html。驱动程序似乎没有等待主服务器的确认。
  • 是的,成功了。我认为设置 WriteresultChecking.EXCEPTION 就足够了。无论如何SAFE 可能很快就会被弃用,所以应该使用WriteConcern.ACKNOWLEDGED
  • btw @BatScream 非常欢迎您添加我会接受的答案。

标签: java spring mongodb mongo-java mongotemplate


【解决方案1】:

需要将MongoDB驱动的WriteConcern设置为Acknowledged

来自文档,

使用此写关注的写操作将等待 在返回之前从主服务器确认。例外 因网络问题和服务器错误而引发。

【讨论】:

    猜你喜欢
    • 2013-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-30
    • 1970-01-01
    • 2016-08-27
    相关资源
    最近更新 更多