3

我想知道如果我不检查错误代码,是否会发现任何持久性失败?如果是这样,在检测错误的同时快速(异步)写入的正确方法是什么?

4

2 回答 2

2

如果你不检查错误,你的更新只是 fireAndForget。您确实会错过所有可能出现的错误。请参阅 MongoDB WriteConcerns了解 MongoDB中可用的写入模式(抱歉,我总是找不到官方的、与驱动程序无关的文档,我真的应该收藏它)。
因此,使用 NORMAL 您至少会遇到连接错误,而 NONE 则完全没有例外。如果您想了解异常情况,则必须使用其他模式之一,它们的不同之处仅在于它们为您提供的持久性保证。
异步运行时无法检测到错误,因为这违背了本意。您发送写操作的连接可能已经关闭或重复使用,因此您无法通过该连接发送它。此外,只有您的实际代码知道如果失败该怎么办。由于 mongoDB 不提供一些远程过程调用来异步通知您更新,您必须等到写入完成到给定阶段。
所以最快但最不可靠的是 SAFE,写入只发生在内存中。JOURNAL 为您提供至少已写入磁盘的安全性。使用 FSYNC,您可以将这些更改保留在磁盘上的数据库中。REPLICA 至少有两个副本已写入它,并且大多数副本已写入它的一半以上(三个副本应该是默认值,这没有区别)。

我看到有类似异步的唯一机会是有一个单独的线程来同步执行所有写操作。这个线程你可以处理实际的更新以及一个类,如果无法执行处理此故障所需的操作,则调用该类。但我不认为这是好的应用程序设计。

于 2012-06-05T09:33:56.013 回答
1

是的,根据错误,如果您不检查返回的错误代码,它可能会静默失败。有必要等待错误检查。您唯一的其他选择是让您的应用程序偶尔告诉用户“哎呀,还记得我刚才表现得好像我保存了您的数据吗?嗯,不是真的。”

于 2012-06-05T07:57:04.093 回答