【问题标题】:Possible to set mongodb writeconcern to only ignore Duplicate Key errors?可以将 mongodb writeconcern 设置为仅忽略重复键错误吗?
【发布时间】:2013-11-09 09:22:32
【问题描述】:

在插入 mongodb 时,我可以将 writeconcern 设置为只会忽略 Duplicate Key 错误的内容吗?我想完全忽略这些错误,但如果出现其他问题,仍然可以捕获。我特别想知道我是否失去了与数据库的连接,或者 mongod 本身是否崩溃。 (我在研究网络上,所以这两件事并不总是最可靠的。)

我看到的似乎接近的 writeconcern 是 UNACKNOWLEDGED,但我不知道它究竟会捕获什么以及将忽略什么。

我的应用程序是用 Java 编写的,带有 2.10.1 版的 mongo 驱动程序和 2.4.6 版的 mongo

我避免使用默认的 writeconcern 并简单地捕获异常,因为我不想要异常开销。我预计重复键的数量会很高。这是一个愚蠢的担忧吗?

【问题讨论】:

  • 你想要做的是捕捉错误但在你的应用程序中忽略它,我不相信这在 MongoDB 方面是可能的,我相信这样的事情是预优化
  • 您的代码导致了如此多的重复键插入,以至于您担心在 Java 中引发异常的性能?哎呀。为什么会产生这么多重复?如果可以的话,最好避免将它们发送到服务器,方法是至少在客户端缓存一个大块的已知重复 ID。
  • @WiredPrairie 我正在做一些长时间的运行(例如,我从不关闭它)流处理,我得到的流(我无法控制)经常包含重复的对象。然而,问题在于确切的重复不会重复,因此没有任何“最常见”重复的概念。我可能会得到数千个独特的项目,所有这些我都已经看过了,但是几周或几个月内我不会再看到这些项目了。我对流处理和大数据还很陌生,因此欢迎您提供任何指示或建议。
  • @WiredPrairie 看来我可能高估了在 Java 中处理异常的成本。

标签: java mongodb


【解决方案1】:

关于WriteConcern 的官方文档显示了 WriteConcern 设置有哪些选项。

WriteConcern.UNACKNOWLEDGED ({w:0,j:0,fsync:0}) 将报告网络错误,因此您已经了解了这一点。当数据库崩溃时,与它的连接将立即中断(当操作系统仍在运行时)或在几秒钟后超时(当整个操作系统甚至物理服务器崩溃时),所以你也应该注意到相当快.

下一个最好的 WriteConcern({w:1,j:0,fsync:0}WriteConcern.SAFE)等待副本集的主节点确认,因此它会报告 primary key 唯一索引错误。

如果有一个设置可以让服务器在收到数据后但在解释数据之前做出响应,它不会更快。验证 BSON 语法通常很便宜,检查任何唯一索引中的冲突也不会贵很多。至少与网络往返时间相比。

当您担心在 Java 中捕获异常的性能时:Java 中的异常处理也不昂贵。

【讨论】:

  • 谢谢,菲利普。 Mongo 网站上的 writeconcern 文档让我感到困惑,因为他们提到了一些关于网络错误的内容,这些错误并不总是根据您的网络配置而被捕获。看起来我还需要更深入地研究 Java 异常处理。我来自 python,而不是 Java,背景和我对 Java 所做的一些研究更喜欢请求许可而不是宽恕给我的印象是异常处理可能会变得很昂贵。
猜你喜欢
  • 2010-09-07
  • 1970-01-01
  • 2017-01-16
  • 1970-01-01
  • 2018-06-17
  • 1970-01-01
  • 2011-01-09
  • 2012-08-14
  • 2011-01-16
相关资源
最近更新 更多