MongoDB Server実行時間の制限
Overview
Scalaドライバーを使用してサーバー操作を実行する場合、サーバーが操作を完了できる時間を制限することもできます。そのためには、クライアント側操作タイムアウト(CST) を指定します。タイムアウトは、サーバーの選択、接続のチェックアウト、サーバー側の実行など、操作を完了するために必要なすべてのステップに適用されます。タイムアウトが経過すると、 Scalaドライバーはタイムアウトの例外を発生させます。
注意
試験用機能
COT 機能は実験的なものであり、今後のドライバー リリースで変更される可能性があります。
timeoutMS オプション
MongoDBデプロイに接続するときにタイムアウトを指定するには、timeoutMS
接続オプションをミリ秒単位でタイムアウトの長さに設定します。 timeoutMS
オプションは、次の方法で設定できます。
MongoClientSettings.Builder
クラスからtimeout()
メソッドを呼び出す接続stringでの
timeoutMS
パラメータの設定
次のコード例では、クライアントレベルのタイムアウトを 200
ミリ秒に設定します。対応するコードを表示するには、MongoClientSettings タブまたは Connection
Stringタブを選択します。
val settings = MongoClientSettings.builder .applyConnectionString(ConnectionString("<connection string>")) .timeout(200L, MILLISECONDS) .build val mongoClient = MongoClient(settings)
val uri = "<connection string>/?timeoutMS=200" val mongoClient = MongoClient(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()
メソッドを呼び出します。
val settings = MongoClientSettings.builder .applyConnectionString(ConnectionString("<connection string>")) .timeout(200L, MILLISECONDS) .build val mongoClient = MongoClient(settings) val database = mongoClient.getDatabase("db") val collection = database.getCollection("people") collection.insertOne(Document("name" -> "Francine Loews"))
タイムアウト継承
timeoutMS
オプションを指定すると、ドライバーは他のScalaドライバー オプションと同じ継承動作に従ってタイムアウトを適用します。以下の表は、各レベルでタイムアウト値がどのように継承されるかを示しています。
レベル | 継承の説明 |
---|---|
操作 | が最も優先され、他のレベルで設定したタイムアウト オプションを上書きします。 |
トランザクション | セッション、コレクション、データベース、またはクライアントレベルで設定したタイムアウト値よりも優先されます。 |
セッション | レベルで別のタイムアウト値を設定しない限り、そのセッション内のすべてのトランザクションと操作に適用されます。 |
Database | レベルで別のタイムアウト値を設定しない限り、そのデータベース内のすべてのセッションと操作に適用されます。 |
コレクション | レベルで別のタイムアウト値を設定しない限り、そのコレクションに対するすべてのセッションと操作に適用されます。 |
クライアント |
|
オーバーライドと特定のオプションの詳細については、次のオーバーライドセクションを参照してください。
の上書き
Scalaドライバーは、データベース操作の動作とパフォーマンスを制御するためのさまざまなレベルの構成をサポートしています。
より具体的なレベルで timeoutMS
オプションを指定すると、クライアントレベルの構成を上書きできます。前のセクションの表では、タイムアウト設定を指定できるレベルについて説明しています。これにより、個々の操作のニーズに基づいてタイムアウトをカスタマイズできます。
次の例では、コレクション レベルのタイムアウト構成がクライアント レベルのタイムアウト構成を上書きする方法を示しています。
val settings = MongoClientSettings.builder .applyConnectionString(ConnectionString("<connection string>")) .timeout(200L, MILLISECONDS) .build val mongoClient = MongoClient(settings) val database = mongoClient.getDatabase("db") val collection = database .getCollection("people") .withTimeout(300L, MILLISECONDS) // ... perform operations on MongoCollection
トランザクション
新しい ScalaClientSession インスタンスを作成してトランザクションを実装する場合は、 ClientSessionOptions
インスタンスを構築するときに defaultTimeout()
メソッドを使用します。このオプションを使用して、次のメソッドのタイムアウトを指定できます。
次のコードは、ClientSession
をインスタンス化するときに defaultTimeout
を設定する方法を示しています。
val opts = ClientSessionOptions.builder .defaultTimeout(200L, MILLISECONDS) .build val session = mongoClient.startSession(opts) // ... perform operations on ClientSession
defaultTimeout
を指定しない場合、ドライバーは親の MongoClient
に設定されたタイムアウト値を使用します。
また、 TransactionOptions
インスタンスを構築するときに timeout()
メソッドを呼び出して、トランザクションレベルのタイムアウトを設定することもできます。このオプションを設定すると、トランザクションの範囲内で実行されるすべての操作にタイムアウトが適用されます。
val transactionOptions = TransactionOptions.builder .timeout(200L, MILLISECONDS) .build
トランザクションの詳細については、 トランザクションの実行ガイドをご覧ください。
クライアントの暗号化
クライアント側フィールドレベル暗号化(CSFLE)を使用する場合、ドライバーは timeoutMS
オプションを使用して暗号化と復号化操作に許可される時間を制限します。 ClientEncryptionSettings
インスタンスを構築するときに timeout()
メソッドを呼び出すことで、ClientEncryption
インスタンスのタイムアウト オプションを設定できます。
ClientEncryption
インスタンスを構築するときにタイムアウトを指定すると、タイムアウトはそのインスタンスで実行されるすべての操作の有効期間を制御します。 ClientEncryption
をインスタンス化するときにタイムアウトを指定しない場合、インスタンスはClientEncryption
コンストラクターで使用される MongoClient
からタイムアウト設定を継承します。
クライアントと ClientEncryption
で直接 timeoutMS
を設定すると、ClientEncryption
に提供された値が優先されます。
Observables
Observable
インスタンスでは、COT 機能を使用する場合に構成可能なタイムアウト設定が提供されます。Observable
の有効期間を構成することで、Observable
の処理を調整できます。タイムアウトモードを設定するには、Observable
を継承する結果を返す操作を実行するときに timeoutMode()
メソッドを使用します。
注意
継承されたタイムアウト
カーソル タイムアウトモードを設定するには、MongoClientSettings
、MongoDatabase
、または MongoCollection
のいずれかでタイムアウトを設定する必要があります。
Observable の詳細については、「Observable からのデータへのアクセス」ガイドを参照してください。
ライフタイムモード
ライフタイムモードでは、 タイムアウト設定を使用して Observable
の有効期間全体を制限します。このモードでは 、アプリケーションはObservable
を初期化し、Observable
メソッドへのすべての呼び出しを完了し、指定された時間制限内にすべてのドキュメントを返す必要があります。停止しない場合、Observable
の有効期限が切れ、ドライバーはタイムアウトのエラーを発生させます。
次の例は、Observable
タイムアウトを設定して、カーソルが初期化され、継承されたタイムアウト内にすべてのドキュメントが検索されるようにする方法を示しています。
val observableWithLifetimeTimeout = collection .find(gte("age", 40)) .timeoutMode(TimeoutMode.CURSOR_LIFETIME)
GridFS
withTimeout()
メソッドを使用して GridFSBucket
をインスタンス化するときにGridFS操作のタイムアウト オプションを設定できます。このタイムアウトは、データのアップロードやダウンロードなど、バケットで実行されるすべての操作に適用されます。タイムアウトを設定しない場合、GridFSBucket
インスタンスは、作成された MongoDatabase
からタイムアウト設定を継承します。
次のコードは、GridFSBucket
をインスタンス化するときにタイムアウトを設定する方法を示しています。
val gridFSBucket = GridFSBucket(database).withTimeout(200L, MILLISECONDS)
重要
観察可能なタイムアウトのサポート
操作タイムアウトを持つ GridFSBucket
で uploadFromObservable()
メソッドを呼び出すと、Observable
クラスには固有の読み取りタイムアウト サポートがないため、タイムアウトが発生する可能性があります。これにより、指定されたタイムアウト制限を超えて操作が延長され、タイムアウトの例外が発生する可能性があります。
API ドキュメント
Scalaドライバーでタイムアウトを使用する方法の詳細については、次のAPIドキュメントを参照してください。