3

何かのエラーチェックを怠った場合、プログラムが早期に失敗し、激しく失敗することを好みます。残念ながら、Mongo 拡張機能では、常にチェックする必要がありますMongoDb->lastError()array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXEPTION)Mongoでエミュレートする簡単な方法はありますか?

できれば、すべてのラッパー クラスを記述する必要はなく、絶対に必要な場合にのみ行います。

4

2 に答える 2

4

Mongo 拡張機能では、常にチェックする必要がありますMongoDb->lastError()

ここで実際に起こっていることは、もう少し微妙です。

デフォルトでは、MongoDB は「ファイア アンド フォーゲット」モードで動作します。したがって、サーバーに書き込みを送信し ( fire )、サーバーがそれを処理することを単純に信頼します ( forget )。これは、すべてのドライバーのすべての書き込みのデフォルト構成です。

例外が必要なため、「セーフ」モードで更新を発行する必要があります。セーフ モードでは、ドライバーlastError()は呼び出し元に制御を返す前に、自動的にコマンドを発行します。

個々の操作でセーフ モードを設定できます。

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

ドライバーは接続レベルでの設定をサポートする必要がありますが、何らかの理由でサポートしていません。array('safe' => true)したがって、それをどこにでも追加する必要があります。

できれば、すべてのラッパークラスを作成する必要のないもの...

残念ながら、これは仕方のないことだと思います。「セーフ」モードは始まりにすぎません。「セーフ」モードでは、プライマリ サーバーのメモリへのコミットのみが保証されます。データがディスク上にあることを確認したい場合は、「fsync」または「journal」を使用する必要があります。レプリカ セットを実行していて、データが 2 つの場所にあることを確認したい場合は、"w" オプションを使用する必要があります。

また、レプリカ セットを使用している場合 ( 10gen がすべての運用展開に推奨)、プライマリがダウンしたときに例外を処理する必要があります。通常、新しい接続を開くと新しいプライマリへの新しい接続が強制されるため、接続を再試行する必要があります。

これは、他の多くの調整とともに、通常、処理する必要があるさまざまな例外ケースのために、コードが何らかのタイプのラッパー クラスを必要とするようになることを意味します。

于 2012-04-15T17:15:11.833 に答える
3

いいえ、これは現在不可能です。これについては、 http://jira.mongodb.orgで機能リクエストを提出してください。

于 2012-04-15T08:45:02.010 に答える