3

如果我忽略了错误检查,我更喜欢我的程序尽早失败并严重失败。不幸的是,Mongo 扩展需要我不断检查MongoDb->lastError(). 有没有一种简单的方法可以array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXEPTION)用 Mongo 进行模拟?

最好是不涉及为所有内容编写包装类的东西,我宁愿只在绝对必须的情况下这样做。

4

2 回答 2

4

Mongo 扩展需要我不断检查MongoDb->lastError()

所以这里实际发生的事情有点微妙。

默认情况下,MongoDB 以“即发即弃”模式运行。所以它向服务器发送一个写操作(fire),然后简单地相信服务器会处理它(忘记)。这是所有驱动程序的所有写入的默认配置。

您需要例外,因此您需要在“安全”模式下发布更新。lastError()在安全模式下,驱动程序会在将控制权返回给调用者之前自动发出命令。

您可以为各个操作设置安全模式:

$collection->insert(array("x" => 1), array("safe" => true));

驱动程序应该支持在连接级别上设置它,但由于某种原因不支持。所以你必须在array('safe' => true)任何地方添加它。

最好是不涉及为所有内容编写包装类的东西......

不幸的是,我认为这是不可避免的。“安全”模式只是一个开始。在“安全”模式下,您只能保证在主服务器上提交内存。如果要确保数据在磁盘上,则需要使用“fsync”或“journal”。如果您正在运行副本集并且想要确保数据位于两个位置,则需要使用一些“w”选项。

此外,如果您使用的是 Replica Sets(10gen 建议所有生产部署都使用 Replica Sets ),那么当主服务器出现故障时,您将不得不处理异常。通常,您希望重试连接,因为打开新连接会强制建立与新主节点的新连接。

这与许多其他调整一起通常意味着您的代码将因为您需要处理各种异常情况而需要某种类型的包装器类。

于 2012-04-15T17:15:11.833 回答
3

不,这目前是不可能的。请为此在http://jira.mongodb.org提交功能请求。

于 2012-04-15T08:45:02.010 回答