MongoDB Server実行時間の制限
項目一覧
Overview
Javaドライバーを使用してサーバー操作を実行する場合、サーバーが操作を完了できる時間を制限することもできます 。そのためには、クライアント側操作タイムアウト(CST) を指定します。タイムアウトは、サーバーの選択、接続のチェックアウト、サーバー側の実行など、操作を完了するために必要なすべてのステップに適用されます。タイムアウトが経過すると、 Javaドライバーはタイムアウトの例外を発生させます。
注意
試験用機能
COT 機能は実験的なものであり、今後のドライバー リリースで変更される可能性があります。
timeoutMS オプション
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
に許容される値に対応するタイムアウト動作を説明しています。
値 | 動作 |
---|---|
正の整数 | 操作完了に使用するタイムアウトを設定します。 |
| 操作がタイムアウトしないことを指定します。 |
| Defers the timeout behavior to the following settings: 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 | レベルで別のタイムアウト値を設定しない限り、そのデータベース内のすべてのセッションと操作に適用されます。 |
コレクション | レベルで別のタイムアウト値を設定しない限り、そのコレクションに対するすべてのセッションと操作に適用されます。 |
クライアント |
|
オーバーライドと特定のオプションの詳細については、次の「 オーバーライド 」セクションを参照してください。
の上書き
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
に提供された値が優先されます。
Cursors
カーソルは、CSO 機能を使用する場合に構成可能なタイムアウト設定を提供します。カーソルの処理を調整するには、 カーソルの有効期間 または カーソルの反復モード のいずれかを構成します。タイムアウトモードを設定するには、Iterable
を返す操作を実行するときに timeoutMode()
メソッドを使用します。
カーソルを作成する操作の場合、タイムアウト設定はカーソルの有効期間を制限するか、元の操作と後続のすべての呼び出しに個別に適用できます。
注意
継承されたタイムアウト
カーソル タイムアウトモードを設定するには、MongoClientSettings
、MongoDatabase
、または 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
メソッドを使用して をインスタンス化するときにGridFS操作のタイムアウト オプションを設定できます。このタイムアウトは、データのアップロードやダウンロードなど、バケットで実行されるすべての操作に適用されます。タイムアウトを設定しない場合、GridFSBucket
withTimeout()
GridFSBucket
インスタンスは、作成されたMongoDatabase
からタイムアウト設定を継承します。
次のコードは、GridFSBucket
をインスタンス化するときにタイムアウトを設定する方法を示しています。
GridFSBucket gridFSBucket = GridFSBuckets .create(database) .withTimeout(200L, MILLISECONDS);
重要
inputStream タイムアウトのサポート
操作タイムアウトを持つ GridFSBucket
で uploadFromStream()
メソッドを呼び出すと、InputStream
クラスには固有の読み取りタイムアウト サポートがないため、タイムアウトが発生する可能性があります。これにより、指定されたタイムアウト制限を超えて操作が延長され、タイムアウトの例外が発生する可能性があります。
API ドキュメント
Javaドライバーでタイムアウトの使用の詳細については、次のAPIドキュメントを参照してください。