Docs Menu
Docs Home
/ / /
Java Sync Driver
/ /

MongoDB Server実行時間の制限

項目一覧

  • Overview
  • timeoutMS オプション
  • 許容タイムアウト値
  • タイムアウト継承
  • の上書き
  • トランザクション
  • クライアントの暗号化
  • Cursors
  • カーソル有効期間モード
  • カーソル反復モード
  • GridFS
  • API ドキュメント

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

注意

試験用機能

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ドライバー オプションと同じ継承動作に従ってタイムアウトを適用します。以下の表は、各レベルでタイムアウト値がどのように継承されるかを示しています。

レベル
継承の説明

操作

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

トランザクション

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

セッション

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

Database

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

コレクション

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

クライアント

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

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

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

より具体的なレベルで 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();
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 機能を使用する場合に構成可能なタイムアウト設定を提供します。カーソルの処理を調整するには、 カーソルの有効期間 または カーソルの反復モード のいずれかを構成します。タイムアウトモードを設定するには、Iterable を返す操作を実行するときに timeoutMode() メソッドを使用します。

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

注意

継承されたタイムアウト

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

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

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

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

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

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

カーソル反復モードでは、タイムアウトが設定され、各呼び出しが next()hasNext()tryNext() メソッドに制限されます。タイムアウトは、各呼び出しが完了した後に更新されます。これは、Cappedコレクションや変更ストリームで find() メソッドによって返される追尾可能 (tailable) カーソルなど、すべての追尾可能 (tailable) カーソルのデフォルトモードです。

次のコード例では、ITERATION タイムアウトモードのカーソルを使用して、db.peopleコレクション内のドキュメントを反復処理し、各ドキュメントの nameフィールド値を検索して出力します。

try (MongoCursor<Document> cursorWithIterationTimeout = collection
.find(gte("age", 40))
.timeoutMode(TimeoutMode.ITERATION)
.cursor()
) {
while (cursorWithIterationTimeout.hasNext()) {
System.out.println(cursorWithIterationTimeout.next().toJson());
}
}

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

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

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

重要

inputStream タイムアウトのサポート

操作タイムアウトを持つ GridFSBucketuploadFromStream() メソッドを呼び出すと、InputStreamクラスには固有の読み取りタイムアウト サポートがないため、タイムアウトが発生する可能性があります。これにより、指定されたタイムアウト制限を超えて操作が延長され、タイムアウトの例外が発生する可能性があります。

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

戻る

Stable API