Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Docs Menu
Docs Home
/ / /
Go Driver
/ /

MongoDB Server実行時間の制限

このガイドでは、 Goドライバーの単一のタイムアウト設定について学習できます。この設定はクライアント側操作タイムアウト(CSO)とも呼ばれます。

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

注意

試験用機能

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

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 に許容される値に対応するタイムアウト動作を説明しています。

動作

正の整数

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

0

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

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

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()

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

カーソルは、CSO 機能を使用する場合に構成可能なタイムアウト設定を提供します。タイムアウト指定を持つ Context をカーソル メソッドに渡すことで、カーソルのタイムアウトを調整できます。

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

例、Cursor.Next() メソッドに Context タイムアウトを渡すと、タイムアウトは結果ドキュメントを取得する各アクションに適用されます。Cursor.All() メソッドに Context タイムアウトを渡すと、タイムアウトはカーソルの有効期間全体に適用されます。

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

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

戻る

Stable API

項目一覧