Docs Menu
Docs Home
/ / /
Java Sync Driver
/

MongoClient の作成

このガイドでは、Java ドライバーを使用して MongoDB Atlas の配置、MongoDB インスタンス、またはレプリカセットに接続する方法を学習します。

Atlas クラスターに接続する ためのサンプル コードを表示するか、 MongoClientクラスと接続 URI の詳細を学習するために読み進めることができます。

MongoDBに接続して通信するには、 MongoClientクラスを使用します。MongoClientSettingsオブジェクトを作成するには、MongoClientSettings.builder() メソッドとチェーン メソッドを使用して設定を指定します。これらを連鎖させた後、build() メソッドを使用して MongoClientSettingsオブジェクトを作成します。

MongoClient の動作を制御するために使用できるさまざまな設定の詳細については、MongoClient 設定の指定 ガイドを参照してください。

この例えでは、 ConnectionStringを指定する方法を示しています。

MongoClient mongoClient = MongoClients.create(
MongoClientSettings.builder()
.applyConnectionString(new ConnectionString("<your connection string>"))
.build());

注意

連鎖注文

設定内の一部のオプションは、接続stringオプションにマップされます。 設定 と 接続stringで同じオプションを指定する場合、それらを連結する順序によってドライバーが使用するオプションが決まります。 ドライバーは、読み込んだ最後の設定を使用します。

たとえば、このスニペットには、ドライバーが利用可能なソケットに接続するための次の時間設定が含まれています。

  • 接続stringは 内の を指定します 2 SECONDS

  • ソケット設定5 SECONDS 以内に指定されます

MongoClient mongoClient = MongoClients.create(
MongoClientSettings.builder().applyConnectionString(new ConnectionString("mongodb+srv://<db_username>:<db_password>@<hostname>:<port>/<auth db>?connectTimeoutMS=2000"))
.applyToSocketSettings(builder ->
builder.connectTimeout(5L, SECONDS))
.build());

ドライバーはソケット設定オプションを最後に読み取るため、タイムアウトする前に 5 SECONDS 以内に使用可能なソケットに接続することが予想されます。

重要

クライアントの再利用

MongoClient はデータベースへのスレッドセーフな接続のプールを表すため、ほとんどのアプリケーションで必要なインスタンスは、複数のスレッド間でも、MongoClient の 1 つだけです。最大接続数などのすべてのリソース使用量の制限は、個々の MongoClient インスタンスに適用されます。

Tip

インスタンスが不要になった場合は、常に MongoClient.close() を呼び出してリソースをクリーンアップします。

接続 URI は、ドライバが MongoDB 配置に接続するための指示のセットを提供します。このセットで、ドライバーに MongoDB への接続方法と接続中の動作を指示します。次の図は、サンプル接続 URI の各部分について説明しています。

プロトコル、認証情報、ホスト名または IP、ポート、および接続オプションを示す接続文字列の例

この例では 、 DNS SRVレコードを持つ Atlas MongoDBデプロイに接続します。詳細については、このガイドの DNS サービス検出 セクション を参照してください。

注意

MongoDB Atlasに配置している場合は、 Atlasドライバー接続ガイドを参照し、言語ドロップダウンからJavaを選択して 接続stringを取得します。

DNS SRV アドレスを持たないインスタンスまたはレプリカセットに接続する場合は、プロトコルに標準接続文字列形式を指定するmongodbを使用する必要があります。

パスワードベースの認証メカニズムを使用している場合は、プロトコルの後、接続文字列に認証情報が含まれます。user の値をユーザー名に、pass の値をパスワードに置き換えます。認証メカニズムで認証情報が必要ない場合は、接続 URI のこの部分を省略します。

接続 URI の次の部分では、ホスト名または IP アドレスを指定し、その後に MongoDB インスタンスのポートを指定します。この例では、sample.host はホスト名を表し、27017 はポート番号を表します。これらの値を置き換えて、MongoDB インスタンスを参照します。

接続 URI の最後の部分には、パラメータとして接続オプションが含まれます。この例では、maxPoolSize=20w=majority の 2 つの接続オプションを設定しています。接続オプションの詳細については、このガイドの「接続オプションの指定」セクションに進んでください。

DNS サービス検出を使用して接続しているサービスの DNS SRVレコードを検索するには、接続文字列で SRV 接続形式を指定します。 この形式を指定すると、 Javaドライバーは新しいホストを自動的に再スキャンします。配置により、クライアント構成を変更しなくても、トポロジーにホストを追加できます。

次のコードは、 SRV 接続形式を使用する接続文字列を示しています。

String uri = "mongodb+srv://<hostname>/";

SRV 接続形式の詳細については、 MongoDB Serverマニュアルの「 SRV 接続形式 」のエントリを参照してください。

Atlas 上の MongoDB 配置に接続するには、クライアントを作成します。MongoClientSettings オブジェクトを MongoClients.create() メソッドに渡すことで、接続文字列とその他のクライアント オプションを使用するクライアントを作成できます。

MongoClientSettings オブジェクトをインスタンス化するには、ビルダ メソッドを使用して接続文字列とその他のクライアント オプションを指定し、build() メソッドを呼び出します。接続 URI を指定するには、applyConnectionString() メソッドをビルダにチェーンします。

MongoDB Server の新しいバージョンにアップグレードするときに重大な変更を回避するために、Stable API バージョンのクライアント オプションを設定できます。Stable API 機能について詳しくは、「Stable API」ページを参照してください。

次のコードは、Atlas 上の MongoDB 配置に接続するときに接続文字列と Stable API クライアント オプションを指定し、接続が成功したことを確認する方法を示します。

package fundamentals;
import com.mongodb.*;
import org.bson.BsonDocument;
import org.bson.BsonInt64;
import org.bson.Document;
import org.bson.conversions.Bson;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoDatabase;
public class MongoClientConnectionExample {
public static void main(String[] args) {
// Replace the placeholder with your Atlas connection string
String uri = "<connection string>";
// Construct a ServerApi instance using the ServerApi.builder() method
ServerApi serverApi = ServerApi.builder()
.version(ServerApiVersion.V1)
.build();
MongoClientSettings settings = MongoClientSettings.builder()
.applyConnectionString(new ConnectionString(uri))
.serverApi(serverApi)
.build();
// Create a new client and connect to the server
try (MongoClient mongoClient = MongoClients.create(settings)) {
MongoDatabase database = mongoClient.getDatabase("admin");
try {
// Send a ping to confirm a successful connection
Bson command = new BsonDocument("ping", new BsonInt64(1));
Document commandResult = database.runCommand(command);
System.out.println("Pinged your deployment. You successfully connected to MongoDB!");
} catch (MongoException me) {
System.err.println(me);
}
}
}
}

Atlas でホストされていない単一の MongoDB 配置またはレプリカセットに接続する場合は、次のセクションで接続方法を確認してください。

開発目的で、MongoDB Atlas クラスターを使用する代わりに、ローカル マシンで MongoDB 配置を実行する必要がある場合は、次の手順を完了する必要があります。

  1. MongoDB Server の Communityバージョン または Enterprise バージョンをダウンロードします。

  2. MongoDB Serverをインストールして構成します。

  3. 配置を開始します。

重要

MongoDB 配置を悪意のある攻撃から常に保護します。 セキュリティ推奨事項のリストについては、「セキュリティ チェックリスト」を参照してください。

MongoDB 配置を正常に開始したら、ドライバー接続コードで接続文字列を指定します。

MongoDB 配置がローカルで実行されている場合は、接続文字列 "mongodb://localhost:<port>" を使用できます。ここで、<port> は、着信接続をリッスンするようにサーバーに設定したポート番号です。

別のホスト名または IP アドレスを指定する必要がある場合は、接続文字列に関するサーバー マニュアルのエントリを参照してください。

配置に接続できるかどうかをテストするには、 への接続 に 記載のコード例の接続string MongoDB Atlasを置き換えて実行します。

MongoDB レプリカセットの配置は、同じデータ セットを保存する接続されたインスタンスのグループです。このインスタンスの構成は、データの冗長性と高いデータ可用性を提供します。

レプリカセット配置に接続するには、レプリカセットのノードのホスト名(または IP アドレス)とポート番号を指定します。

レプリカセット内のホストの完全なリストを提供できない場合は、レプリカ内のホストの 1 つまたはサブセットを指定し、次のいずれかの方法で自動検出を実行するようにドライバーに指示できます。

  • replicaSet パラメータの値としてレプリカセットの名前を指定

  • directConnection パラメーターの値として false を指定

  • レプリカセットに複数のホストを指定

Tip

レプリカセットのホストのサブセットを指定することもできますが、レプリカセットのすべてのホストを含めることで、ホストの 1 つが到達できない場合でもドライバが接続を確立できるようにします。

次の例は、ConnectionString クラスまたは MongoClientSettings クラスを使用して、MongoClient インスタンスに複数のホストを指定する方法を示しています。使用するクラスに対応するタブを選択します。

ConnectionString connectionString = new ConnectionString("mongodb://host1:27017,host2:27017,host3:27017");
MongoClient mongoClient = MongoClients.create(connectionString);
ServerAddress seed1 = new ServerAddress("host1", 27017);
ServerAddress seed2 = new ServerAddress("host2", 27017);
ServerAddress seed3 = new ServerAddress("host3", 27017);
MongoClientSettings settings = MongoClientSettings.builder()
.applyToClusterSettings(builder ->
builder.hosts(Arrays.asList(seed1, seed2, seed3)))
.build();
MongoClient mongoClient = MongoClients.create(settings);

注意

Docker のレプリカセット

レプリカセットがDockerで実行される場合、公開されるMongoDBエンドポイントは 1 つだけです。この場合、レプリカセットは検出できません。接続 URI で directConnection=false を指定するか、このオプションを未設定のままにすると、アプリケーションがその接続に接続できなくなる可能性があります。

テスト環境または開発環境では、directConnection=true を指定してレプリカセットに接続できます。本番環境では、Docker 仮想ネットワークの外部から各 MongoDB インスタンスにアクセスできるようにクラスターを構成することを推奨します。

このセクションでは、 MongoDB .に接続するときに発生し得る質問に答えます。

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

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

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

  • MongoDatabase を使用し、そこから MongoCollection を使用してCRUD APIにアクセスします。

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

  • MongoClientOptionsMongoClientURI を使用する構成。

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

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

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

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

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

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

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

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

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

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

Tip

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

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

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

  • 接続 URI は、正しいMongoDBデプロイに対応します。接続 URI の設定の詳細については、接続 URI を参照してください。

  • 指定した認証メカニズムの認証情報が正しいです。認証情報を指定する方法については、認証メカニズムのガイドを参照してください。

  • 指定した認証データベースの名前が正しい名前を付けました。 MongoDB 配置のユーザーとロールを設定する方法については、サーバー ドキュメントの「 ユーザーとロールの管理」を参照してください。

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

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

Tip

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

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

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

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

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

戻る

接続