6

MongoDB 用の最新の Java ドライバー (2.11.1) を使用しています。MongoDB Java API は本質的に

  • MongoClient クラスの 1 つのインスタンス (内部接続プールを使用)
  • DB オブジェクトを取得するための getDB()
  • DBCollection オブジェクトを取得するための getCollection()

1) データベースへの接続はいつ確立されますか? getDB() が呼び出されたときですか、それとも getCollection() が呼び出されたときですか?

2) getDB() を一度呼び出すのと、必要なときに呼び出すのとではどちらがよいですか? (それは問題ですか? - MongoClient は DB オブジェクトをキャッシュに保持しますか?)

3) マルチスレッドで単一の DBCollection オブジェクトを再利用するか、マルチスレッドから getCollection() を呼び出す方が良いですか? (DBCollection はキャッシュされますか?)

4

2 に答える 2

7

MongoClient クラスは、クライアント アプリケーションから MongoDB クラスターへの遅延ロード接続プールを管理します。ホストごとの特定の接続数と、接続を待機するスレッドの数で MongoClient を初期化できます。MongoClient は接続数とスレッドの同時実行数の両方を管理するため、仮想マシンごとにクラスのインスタンスを 1 つ使用する必要があります。DB と DBCollection の両方が MongoClient の接続プールを介して操作を実行するため、その理由でそれらをキャッシュする必要はありません。インスタンス化する DB または DBCollection オブジェクトの数に制限はありません。ただし、これらのクラスはスレッドセーフであり、特定の読み取り設定と書き込みの懸念事項を設定できるため、DB または DBCollection クラスの単一インスタンスを使用して複数の操作を実行できます。

于 2013-06-11T15:18:47.213 に答える
0

1)何らかの操作(検索、更新、削除など)を行うと接続が確立されます

2) Doc は次のように述べています。「通常、特定のデータベース クラスタに対してインスタンスを 1 つだけ作成し、アプリケーション全体で使用します」。したがって、DB オブジェクトをキャッシュする意味はなく、ドライバー コードでもキャッシュされません。

3) DBCollection と DB はスレッドセーフです。DBCollection は、ドライバーの DBApiLayer クラスにキャッシュされます。

于 2013-06-06T08:35:15.070 に答える