Overview
このガイドでは、 Goドライバーの単一のタイムアウト設定について学習できます。この設定はクライアント側操作タイムアウト(CSO)とも呼ばれます。
Goドライバー を使用してサーバー操作を実行する場合、サーバーが操作を完了できる時間を制限することもできます 。タイムアウトは、サーバーの選択、接続のチェックアウト、サーバー側の実行など、操作を完了するために必要なすべてのステップに適用されます。タイムアウトが経過すると、 Goドライバーはタイムアウトの例外を発生させます。
注意
試験用機能
COT 機能は実験的なものであり、今後のドライバー リリースで変更される可能性があります。
timeoutMS オプション
MongoDBデプロイに接続するときにタイムアウトを指定するには、timeoutMS
接続オプションをミリ秒単位でタイムアウトの長さに設定します。timeoutMS
オプションは、次の方法で設定できます。
Client
インスタンスのオプションを指定するときにSetTimeout()
メソッドを呼び出す接続stringでの
timeoutMS
パラメータの設定
次のコード例では、クライアントレベルのタイムアウトを 200
ミリ秒に設定します。対応するコードを表示するには、Client タブまたは Connection
Stringタブを選択します。
opts := options.Client().SetTimeout(200 * time.Millisecond) client, err := mongo.Connect(opts)
uri := "<connection string>/?timeoutMS=200" client, err := mongo.Connect(options.Client().ApplyURI(uri))
注意
タイムアウト指定による再試行
操作レベルのコンテキストで、Client
または にタイムアウトを設定し、サーバーが再試行可能なエラーを返した場合、ドライバーはタイムアウト前に操作を可能な限り再試行します。
タイムアウトが経過すると、ドライバーはタイムアウトのエラーを返します。 の再試行可能な読み取りと再試行可能な書込みの詳細については、サーバー マニュアルを参照してください。
許容タイムアウト値
次の表では、timeoutMS
に許容される値に対応するタイムアウト動作を説明しています。
値 | 動作 |
---|---|
正の整数 | 操作完了に使用するタイムアウトを設定します。 |
| 操作がタイムアウトしないことを指定します。 |
| Defers the timeout behavior to the following settings: These settings are deprecated and are ignored if you set timeoutMS . |
timeoutMS
オプションを指定すると、ドライバーは指定されたタイムアウトを各サーバー操作に自動的に適用します。
タイムアウト継承
デフォルトでは 、操作のコンテキストで特定の操作に別のタイムアウトを設定しない場合、アプリケーション内のすべての操作は Client
から Timeout
オプションを継承します。
操作に渡された Context にタイムアウトを設定すると、ドライバーはその値を操作に使用します。 Context タイムアウトを指定しない場合、操作Context は Client
インスタンスからタイムアウトを生成します。
以下の表は、各レベルでタイムアウト値がどのように継承されるかを示しています。
レベル | 継承の説明 |
---|---|
操作 | が最も優先され、他のレベルで設定したタイムアウト オプションを上書きします。 |
トランザクション | クライアントレベルで設定したタイムアウト値よりも優先されます。 |
クライアント | クライアントタイムアウトが特に指定されていない、すべてのデータベース、コレクション、セッション、トランザクション、および操作に適用されます。 |
オーバーライドと特定のオプションの詳細については、次のオーバーライドセクションを参照してください。
の上書き
Goドライバーは、データベース操作の動作とパフォーマンスを制御するためのさまざまなレベルの構成をサポートしています。
より具体的なレベルで timeoutMS
オプションを指定すると、クライアントレベルの構成を上書きできます。前のセクションの表では、タイムアウト設定を指定できるレベルについて説明しています。これにより、個々の操作のニーズに基づいてタイムアウトをカスタマイズできます。
次の例では、Context で操作レベルのタイムアウトを設定する方法を示しています。これは、クライアント レベルのタイムアウトよりも優先順位されます。
opts = options.Client().SetTimeout(200 * time.Millisecond) client, err = mongo.Connect(opts) if err != nil { log.Fatal(err) } coll := client.Database("db").Collection("people") ctx, cancel := context.WithTimeout(context.TODO(), 300*time.Millisecond) defer cancel() _, err = coll.InsertOne(ctx, bson.D{{"name", "Agnes Georgiou"}})
トランザクション
withTransaction() メソッドを使用してトランザクションを実行するときに、 Context 内でタイムアウトを設定することでトランザクション操作にタイムアウトを適用できます。
次のコードは、トランザクションを実行するために WithTransaction()
メソッドを呼び出すときに Context タイムアウトを設定する方法を示しています。
txnContext, cancel := context.WithTimeout(context.TODO(), 300*time.Millisecond) defer cancel() result, err := session.WithTransaction(txnContext, func(ctx context.Context) (string, error) { // Perform transaction operations })
Context タイムアウトを指定しない場合、ドライバーは親の Client
に設定されたタイムアウト値を継承します。
次のセッション メソッドにコンテキスト タイムアウトを渡すこともできます。
AbortTransaction()
CommitTransaction()
EndSession()
トランザクションの詳細については、 トランザクションガイド を参照してください。
Cursors
カーソルは、CSO 機能を使用する場合に構成可能なタイムアウト設定を提供します。タイムアウト指定を持つ Context をカーソル メソッドに渡すことで、カーソルのタイムアウトを調整できます。
カーソルを作成する操作の場合、タイムアウト設定はカーソルの有効期間を制限するか、元の操作と後続のすべての呼び出しに個別に適用できます。
例、Cursor.Next()
メソッドに Context タイムアウトを渡すと、タイムアウトは結果ドキュメントを取得する各アクションに適用されます。Cursor.All()
メソッドに Context タイムアウトを渡すと、タイムアウトはカーソルの有効期間全体に適用されます。
カーソルの詳細については、カーソルからデータにアクセスする ガイドを参照してください。
API ドキュメント
Goドライバーでタイムアウトを使用する方法の詳細については、次のAPIドキュメントを参照してください。