Docs Menu
Docs Home
/ / /
Java Reactive Streams ドライバー
/

MongoDB Server実行時間の制限

Java Reactive Streams ドライバーを使用してサーバー操作を実行する場合、サーバーが操作を完了できる時間を制限することもできます。そのためには、クライアント側操作タイムアウト(CST) を指定します。タイムアウトは、サーバーの選択、接続のチェックアウト、サーバー側の実行など、操作を完了するために必要なすべてのステップに適用されます。タイムアウトが経過すると、 Java Reactive Streams ドライバーはタイムアウトの例外を発生させます。

注意

試験用機能

COT 機能は実験的なものであり、今後のドライバー リリースで変更される可能性があります。

MongoDBデプロイに接続するときにタイムアウトを指定するには、timeoutMS 接続オプションをミリ秒単位でタイムアウトの長さに設定します。timeoutMS オプションは、次の方法で設定できます。

  • MongoClientSettings.Builderクラスから timeout() メソッドを呼び出す

  • 接続stringでの timeoutMS パラメータの設定

次のコード例では、クライアントレベルのタイムアウトを 200 ミリ秒に設定します。対応するコードを表示するには、MongoClientSettings タブまたは Connection Stringタブを選択します。

MongoClientSettings settings = MongoClientSettings.builder()
.applyConnectionString(new ConnectionString("<connection string>"))
.timeout(200L, MILLISECONDS)
.build();
MongoClient mongoClient = MongoClients.create(settings);
String uri = "<connection string>/?timeoutMS=200";
MongoClient mongoClient = MongoClients.create(uri);

次の表では、timeoutMS に許容される値に対応するタイムアウト動作を説明しています。

動作

正の整数

操作完了に使用するタイムアウトを設定します。

0

操作がタイムアウトしないことを指定します。

null または 設定されていない

Defers the timeout behavior to the following settings:
  • waitQueueTimeoutMS

  • socketTimeoutMS

  • wTimeoutMS

  • maxTimeMS

  • maxCommitTimeMS

These settings are deprecated and are ignored if you set timeoutMS.

timeoutMS オプションを指定すると、ドライバーは指定されたタイムアウトを各サーバー操作に自動的に適用します。次のコード例では、クライアントレベルで 200 ミリ秒のタイムアウトを指定し、MongoCollection.insertOne() メソッドを呼び出します。

MongoClientSettings settings = MongoClientSettings.builder()
.applyConnectionString(new ConnectionString("<connection string>"))
.timeout(200L, MILLISECONDS)
.build();
try (MongoClient mongoClient = MongoClients.create(settings)) {
MongoDatabase database = mongoClient.getDatabase("db");
MongoCollection<Document> collection = database.getCollection("people");
collection.insertOne(new Document("name", "Francine Loews"));
}

timeoutMS オプションを指定すると、ドライバーは他のJava Reactive Streams ドライバー オプションと同じ継承動作に従ってタイムアウトを適用します。以下の表は、各レベルでタイムアウト値がどのように継承されるかを示しています。

レベル
継承の説明

操作

が最も優先され、他のレベルで設定したタイムアウト オプションを上書きします。

トランザクション

セッション、コレクション、データベース、またはクライアントレベルで設定したタイムアウト値よりも優先されます。

セッション

レベルで別のタイムアウト値を設定しない限り、そのセッション内のすべてのトランザクションと操作に適用されます。

Database

レベルで別のタイムアウト値を設定しない限り、そのデータベース内のすべてのセッションと操作に適用されます。

コレクション

レベルで別のタイムアウト値を設定しない限り、そのコレクションに対するすべてのセッションと操作に適用されます。

クライアント

timeoutMSが特に指定されていない、すべてのデータベース、コレクション、セッション、トランザクション、操作に適用されます。

オーバーライドと特定のオプションの詳細については、次のオーバーライドセクションを参照してください。

Java Reactive Streams ドライバーは、データベース操作の動作とパフォーマンスを制御するためのさまざまなレベルの構成をサポートしています。

より具体的なレベルで timeoutMS オプションを指定すると、クライアントレベルの構成を上書きできます。前のセクションの表では、タイムアウト設定を指定できるレベルについて説明しています。これにより、個々の操作のニーズに基づいてタイムアウトをカスタマイズできます。

次の例では、コレクション レベルのタイムアウト構成がクライアント レベルのタイムアウト構成を上書きする方法を示しています。

MongoClientSettings settings = MongoClientSettings.builder()
.applyConnectionString(new ConnectionString("<connection string>"))
.timeout(200L, MILLISECONDS)
.build();
try (MongoClient mongoClient = MongoClients.create(settings)) {
MongoDatabase database = mongoClient.getDatabase("db");
MongoCollection<Document> collection = database
.getCollection("people")
.withTimeout(300L, MILLISECONDS);
// ... perform operations on MongoCollection
}

新しい ClientSession インスタンスを作成してトランザクションを実装する場合は、 ClientSessionOptionsインスタンスを構築するときに defaultTimeout() メソッドを使用します。このオプションを使用して、次のメソッドのタイムアウトを指定できます。

次のコードは、ClientSession をインスタンス化するときに defaultTimeout を設定する方法を示しています。

ClientSessionOptions opts = ClientSessionOptions.builder()
.defaultTimeout(200L, MILLISECONDS)
.build();
Publisher<ClientSession> session = mongoClient.startSession(opts);
// ... perform operations on ClientSession

defaultTimeout を指定しない場合、ドライバーは親の MongoClient に設定されたタイムアウト値を使用します。

また、 TransactionOptionsインスタンスを構築するときに timeout() メソッドを呼び出して、トランザクションレベルのタイムアウトを設定することもできます。このオプションを設定すると、トランザクションの範囲内で実行されるすべての操作にタイムアウトが適用されます。

TransactionOptions transactionOptions = TransactionOptions.builder()
.timeout(200L, MILLISECONDS)
.build();

トランザクションの詳細については、 トランザクションガイド を参照してください。

クライアント側フィールドレベル暗号化(CSFLE)を使用する場合、ドライバーは timeoutMS オプションを使用して暗号化と復号化操作に許可される時間を制限します。ClientEncryptionSettingsインスタンスを構築するときに timeout() メソッドを呼び出すことで、ClientEncryptionインスタンスのタイムアウト オプションを設定できます。

ClientEncryptionインスタンスを構築するときにタイムアウトを指定すると、タイムアウトはそのインスタンスで実行されるすべての操作の有効期間を制御します。ClientEncryption をインスタンス化するときにタイムアウトを指定しない場合、インスタンスはClientEncryption コンストラクターで使用される MongoClient からタイムアウト設定を継承します。

クライアントと ClientEncryption で直接 timeoutMS を設定すると、ClientEncryption に提供された値が優先されます。

カーソルは、CSO 機能を使用する場合に構成可能なタイムアウト設定を提供します。カーソルの処理を調整するには、 カーソルの有効期間 または カーソルの反復モード のいずれかを構成します。タイムアウトモードを設定するには、Publisher インターフェースから継承する結果を返す操作を実行する場合に timeoutMode() メソッドを使用します。

カーソルを作成する操作の場合、タイムアウト設定はカーソルの有効期間を制限するか、元の操作と後続のすべての呼び出しに個別に適用できます。

注意

継承されたタイムアウト

カーソル タイムアウトモードを設定するには、MongoClientSettingsMongoDatabase、または MongoCollection のいずれかでタイムアウトを設定する必要があります。

カーソルの詳細については、カーソルからデータにアクセスする ガイドを参照してください。

カーソル有効モードでは、 タイムアウト 設定を使用してカーソルの有効期間全体を制限します。このモードでは 、アプリケーションはカーソルを初期化し、カーソル メソッドへのすべての呼び出しを完了し、指定された時間制限内にすべてのドキュメントを返す必要があります。停止しない場合、カーソルの有効期限が切れ、ドライバーはタイムアウトのエラーを発生させます。

close() メソッドを呼び出してカーソルを閉じると、killCursors コマンドのタイムアウトがリセットされ、サーバー側のリソースがクリーンアップされるようになります。

次の例は、カーソルが初期化され、継承されたタイムアウト内にすべてのドキュメントが検索されるようにするためにカーソルのタイムアウトを設定する方法を示しています。

FindPublisher<Document> findPublisherWithLifetimeTimeout = collection
.find(gte("age", 40))
.timeoutMode(TimeoutMode.CURSOR_LIFETIME);

withTimeout() メソッドを使用して GridFSBucket をインスタンス化するときにGridFS操作のタイムアウト オプションを設定できます。このタイムアウトは、データのアップロードやダウンロードなど、バケットで実行されるすべての操作に適用されます。タイムアウトを設定しない場合、GridFSBucketインスタンスは、作成された MongoDatabase からタイムアウト設定を継承します。

次のコードは、GridFSBucket をインスタンス化するときにタイムアウトを設定する方法を示しています。

GridFSBucket gridFSBucket = GridFSBuckets
.create(database)
.withTimeout(200L, MILLISECONDS);

Java Reactive Streams ドライバーでタイムアウトの使用方法の詳細については、次のAPIドキュメントを参照してください。

戻る

接続 URI オプション

項目一覧