Docs Menu
Docs Home
/ / /
Java 同期

FAQ

項目一覧

MongoDB 配置への接続で問題が発生した場合に考えられる解決策については、「 接続トラブルシューティング ガイド 」を参照してください。

MongoClientには 2 つのタイプがあります。これは、CRUD API を複数含めることの混乱がない、新規ユーザー向けのよりクリーンな API が必要なためです。 新しい CRUD API が Java 9 で導入された Java モジュールのサポートで適した Java パッケージ構造で使用できることを確認する必要がありました。

新しいアプリケーションでは通常、次の要素をサポートするcom.mongodb.client.MongoClientインターフェースを使用する必要があります。

  • MongoClientSettingsConnectionStringによる構成。 com.mongodb.client.MongoClientsクラスで定義されたファクトリー メソッドを使用して、このインターフェースのインスタンスを作成できます。

  • MongoDatabaseを使用する CRUD API と、ここからMongoCollection

次のレガシー API をサポートする必要がある場合は、 com.mongodb.MongoClientクラスを使用する必要があります。

  • MongoClientOptionsMongoClientURIによる構成

  • DBを使用し、ここからDBCollectionを使用する CRUD API 。 この API には、 getDB()メソッドからアクセスできます。

新しい API とレガシー API の組み合わせを必要とするアプリケーションの場合、 com.mongodb.MongoClientは次のものもサポートします。

  • MongoClientSettingsConnectionStringによる構成。唯一の違いは、ファクトリー クラスではなくコンストラクターを使用して インスタンスを作成することです。

  • MongoDatabaseを使用し、ここからMongoCollectionを使用する CRUD API 。 この API には、 getDatabase()メソッドからアクセスできます。

MongoClientSettingsクラスを使用して、 MongoClientインスタンスの構成を指定できます。 MongoClientSettingsインスタンスを構築するには、 MongoClientSettings.Builderクラスを使用します。

以下は、 MongoClientSettingsクラスを使用してさまざまなタスクを実行する方法を示すドキュメントのセクションです。

MongoClientSettingsクラスの詳細については、 MongoClientSettings の API ドキュメントを参照してください。

すべてのMongoClientインスタンスには、MongoDB トポロジー内の各サーバーに対する接続プールが組み込まれています。 接続プールはオンデマンドでソケットを開き、マルチスレッド アプリケーションで同時 MongoDB 操作をサポートします。

各接続プールの最大サイズはmaxPoolSizeオプションによって設定され、デフォルトは100になります。 サーバーへの使用中の接続数がmaxPoolSizeの値に達した場合、そのサーバーへの次のリクエストは、接続が利用可能になるまで待機します。

MongoClientインスタンスは、サーバーの状態を監視するために MongoDB トポロジー内のサーバーごとに 2 つの追加のソケットを開きます。

たとえば、3 ノードのレプリカセットに接続されたクライアントは 6 個の監視ソケットを開きます。 また、各サーバー上でアプリケーションのスレッドをサポートするために必要な数のソケットを開きます(上限はmaxPoolSizeの値まで)。 maxPoolSize100で、アプリケーションがプライマリ(デフォルト)のみを使用している場合、プライマリ接続プールのみが増加し、合計接続数は最大106になります。 アプリケーションが 読み込み設定( read preference ) を使用してセカンダリ ノードをクエリする場合、それらのプールも大きくなり、合計接続数が306になる可能性があります。

さらに、接続プールにはレート制限があり、各接続プールは一度に最大でmaxConnectingの接続のみを並列に作成できます。 次の場合、追加のスレッドは待機を停止します。

  • 既存のスレッドの 1 つが接続の作成を完了するか、既存の接続がプールにチェックバックされます。

  • 接続作成のレート制限により、既存の接続を再利用するドライバーの能力が向上します。

minPoolSizeオプションを使用して、各サーバーへの同時接続の最小数を設定できます。デフォルトは0になります。 接続プールはこのソケット数で初期化されます。 ネットワークエラーによってソケットが閉じられ、ソケットの合計数(使用中とアイドル状態の両方)が最小値を下回る場合、最小値に達するまでさらにソケットが開かれます。

接続が削除され、 maxIdleTimeMSオプションに置き換えられる前に、プール内でアイドル状態を維持できる最大数を設定できます。この値のデフォルトは0 (制限なし)です。

MongoClientの次のデフォルト構成はほとんどのアプリケーションで動作します。

MongoClient client = new MongoClient("<connection string>")

クライアントはプロセスごとに 1 回作成し、すべての操作で再利用します。 リクエストごとに新しいクライアントを作成することがよくあり、非常に非効率的です。

1 つのプロセス内で多数の同時 MongoDB 操作をサポートするには、 maxPoolSizeを増やすことができます。 プールが最大サイズに達すると、追加のスレッドはソケットが使用可能になるまで待機します。

ドライバーはソケットが利用可能になるまで待機できるスレッド数を制限しません。負荷が急増したときにプールのサイズを境界のあるキューに制限するのはアプリケーションの責任です。 スレッドはwaitQueueTimeoutMSオプションで指定された時間だけ待機します。デフォルトは120000 、つまり 120 秒です。

ソケットを取得するためにwaitQueueTimeoutMSで定義された時間以上待機するスレッドは、接続エラーを発生させます。 すべての操作を完了することよりも、負荷急増中に操作の継続時間を制限することが重要な場合は、このオプションを使用します。

MongoClient.close()が任意のスレッドによって呼び出されると、ドライバーはすべてのアイドル ソケットを閉じ、プールに返されるときに使用中のすべてのソケットを閉じます。

Java ランタイム環境で実行時にクラス ファイルが見つからない場合、 java.lang.NoClassDefFoundError例外が発生することがあります。 MongoDB Java ドライバーを使用するアプリケーション コードを実行する場合は、クラスパスに適切なドライバー JAR ファイルを含める必要があります。

Java ドライバー JAR ファイルをクラスパスに追加した後にこのエラーが発生した場合は、環境内の次の項目を確認してください。

  • JAR ファイルは、クラスパスで指定されたロケーションに存在します。

  • クラスパス構文は正しいです。

  • 環境変数でクラスパスを定義すると、Java ランタイム環境はその変数を使用します。

  • 依存関係マネージャーを使用すると、解決できない競合は報告されません。

Tip

このエラーにはパッケージ名とクラス名が含まれているため、クラスパスからどのドライバー JAR が欠落している可能性があるかを特定できます。 エラーが参照するドライバー JAR を見つけるには、 API ドキュメントの各エントリを確認してください。

MongoDB 配置に接続するときに無効な、または誤った形式の認証情報を指定すると、アプリケーションはこの例外をスローする可能性があります。

MongoDB 配置に接続しようとしたときにこのエラーが発生した場合は、コード内の次の項目を確認してください。

誤った形式のドキュメントを 操作に渡し、かつそれ以前のドライバー バージョン 4.7 またはそれ以前のバージョンを使用している場合、アプリケーションではこの例外がスローされることがあります。

注意

ドライバー バージョン 4.8 以降では、このエラーメッセージは に置き換えられ、どのエラーが誤って形式化されたかに関するより具体的な詳細が含まれるようになりました。

たとえば、次のコード例に示すように、更新操作を呼び出し、更新演算子を誤って省略すると、ドライバーはこのエラーをスローします。

// incorrectly formatted update document
collection.updateOne(
new Document().append("name", "fizz"),
new Document().append("name", "buzz")
);

このエラーを回避するには、適切な操作のビルダ クラスを使用します。 このドライバーは、MongoDB 操作用に構文的に正しい BSON を作成するためのビルダ クラスを提供します。 次のコード例に示すように、前の例はビルダ クラスを使用して正しく表現できます。

// Builder class imports
import static com.mongodb.client.model.Filters.*;
import static com.mongodb.client.model.Updates.*;
// ...
collection.updateOne(eq("name", "fizz"), set("name", "buzz"));

利用可能なビルダ クラスの詳細については、ビルダのドキュメントを参照してください。

MongoDB への接続を閉じたMongoClientインスタンスに対して 操作を呼び出すと、この例外が発生することがあります。 close()メソッドがMongoClientで呼び出されると、そのインスタンスでのそれ以降の操作呼び出しでこの例外がスローされます。

この例外を回避するには、 close()を呼び出すコードの後に、 MongoClientインスタンスに対する操作を呼び出さないようにします。

Tip

MongoClientインスタンスを閉じるコードを見つけるのが困難な場合があります。 この例外の潜在的な原因を見つけるには、次のケースを検索してください。

  • MongoClientインスタンスでclose()を呼び出す

  • MongoClientが宣言されているtry-with-resources ステートメントの範囲外のMongoClientインスタンスでの操作呼び出し

アプリケーションでMongoClientを管理するフレームワークが使用されている場合は、接続動作を管理するためのベストプラクティスを参照してください。

SPI から MongoDB へのアクセスの詳細については、「 SPI と MongoDB 」を参照してください。

いいえ、 PojoCodecProviderは ObjectId を自動的に生成します。

はい。 この例については、次 の実装を参照してください

はい、弁別子を使用します。

弁別子は、特定のドキュメント スキーマを識別するプロパティです。 これは、同じコレクションまたは親ドキュメント(サブドキュメントを埋め込む場合)内に複数のタイプのドキュメントを継承したり保存したりするために使用できます。

たとえば、Java で拡張するEventクラスがある場合(例: MachineEventまたはNetworkEvent )では、弁別子を使用して、 PojoCodecProviderがドキュメントを直列化または逆直列化するために使用するクラスを識別します。

詳しくは、「 POJO カスタマイズ ガイド 」を参照してください。

はい。3.7 Java ドライバーはJSR-310 InstantLocalDateLocalDateTimeのネイティブ サポートを追加します。

はい、このクラス用に独自のコーデックをビルドし、それをレジストリに追加できます。

コーデックをプロバイダーのリストの最初の、デフォルトのコーデック レジストリの前、およびPojoCodecProviderの前に追加します。

CodecRegistry registry = CodecRegistries.fromRegistries(
CodecRegistries.fromCodecs(
new MyDateAsStringCodec()),
MongoClientSettings.getDefaultCodecRegistry(),
fromProviders(pojoCodecProvider));

パブリック セットが使用できない場合に、リフレクションを通じてプライベート フィールドを設定するSET_PRIVATE_FIELDS_CONVENTIONを使用するようにPojoCodecProviderを構成できます。

いいえ。ネイティブ POJO コーデックでは、ゲッター/セッターが各フィールドに対して同じ修飾子を持つことを前提としています。

たとえば、次のメソッドはエンコード中に の例外をスローします。

private String getField();
public String setField(String x);

この例外は、現在では存在しないため、クラスのコーデックを登録する必要があることを意味します。

注釈はありません。 次に示すように、クラスに静的stringを追加することをお勧めします。

public class Person {
public static final String COLLECTION_NAME = "people";
}

次のスニペットは、特定の POJO クラスのコレクション名を指定します。

database.getCollection(Person.COLLECTION_NAME, Person.class);

次の例は、レガシー API と現在の API を使用して MongoDB インスタンスに接続する方法を示しています。

このドキュメントのみを含むコレクションに接続していると仮定します。

{"_id": 1, "val": 1}
MongoClient client = new MongoClient(URI);
DB db = client.getDB(DATABASE);
DBCollection col = db.getCollection(COLLECTION);
DBObject doc = col.find().one();
System.out.println(doc.toString());
MongoClient client = MongoClients.create(URI);
MongoDatabase db = client.getDatabase(DATABASE);
MongoCollection<Document> col = db.getCollection(COLLECTION);
// Prints the first document retrieved from the collection as JSON
Document doc = col.find().first();
System.out.println(doc.toJson());

上記のコード スニペットの出力は次のようになります。

{"_id": 1, "val": 1}

前の例で使用されているレガシー クラスとメソッドの詳細については、次の API ドキュメント ページを参照してください。

レガシー API と現在の API の違いのリストについては、「 レガシー API からの移行」ページを参照してください。

以下は、レガシーのMongoClientOptions クラスとMongoClientURI クラスを使用して書込み保証を設定する方法を示す例えです。

MongoClientURI mongoURI = new MongoClientURI(URI,
MongoClientOptions.builder()
.writeConcern(WriteConcern.W1));
MongoClient client = new MongoClient(mongoURI);
MongoClientSettings options = MongoClientSettings.builder()
.applyConnectionString(new ConnectionString(URI))
.writeConcern(WriteConcern.W1).build();
MongoClient client = MongoClients.create(options);

前の例で使用されているレガシー クラスとメソッドの詳細については、次の API ドキュメント ページを参照してください。

レガシー API と現在の API の違いのリストについては、「 レガシー API からの移行」ページを参照してください。

ここで質問の回答が見つからない場合は、「問題とヘルプ 」セクションに記載されているフォーラムとサポート チャネルをお試しください。

戻る

API ドキュメント

項目一覧