Context
Overview
MongoDB Goドライバーは、Go の標準ライブラリの コンテキストパッケージ を使用して、アプリケーションがブロッキング メソッド呼び出しのタイムアウトとキャンセルをシグナルできるようにします。ブロッキング メソッドは、ネットワーク入力や出力などの 外部イベントに依存してタスクを続行します。
Go ドライバーのブロッキング メソッドの例は、 Insert()
メソッドです。 10 秒以内にCollection
で挿入操作を実行したい場合は、タイムアウトのあるコンテキストを使用できます。 操作がタイムアウト内に完了しない場合、メソッドはエラーを返します。
client := mongo.Connect(context.TODO()) ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() client.Database("<db>").Collection("<collection>").Insert(ctx, bson.D{{"x",1}})
操作に渡される Context に期限がない場合は、 Client
にTimeout
オプションを設定できます。これにより、操作のタイムアウト仕様はこの設定から派生します。 単一のタイムアウト設定の使用の詳細については、「 接続ガイド 」を参照してください。
有効期限
ドライバーは、操作がタイムアウトを超えた場合、またはキャンセルされた場合、Context を期限切れと見なします。 ドライバーはDone()
メソッドを使用して Context の有効期限を確認します。
次のセクションでは、ドライバーによる有効期限のチェックのタイミングと方法について説明します。
サーバーの選択
ドライバーは、操作のサーバーを選択できない場合、メソッド呼び出しをブロックすることがあります。
このシナリオでは、ドライバーは操作に使用するサーバーを見つけるまでループ処理を行います。 各反復処理後にコンテキストの有効期限が切れた場合、または選択プロセスがserverSelectionTimeoutMS
設定よりも時間がかかる場合、ドライバーはサーバー選択タイムアウトのエラーを返します。
ドライバーがサーバーを選択する方法の詳細については、「サーバー選択アルゴリズム 」を参照してください。
接続チェックアウト
チェックアウトできる接続がない場合、ドライバーはメソッド呼び出しをブロックすることがあります。
サーバーを選択すると、ドライバーはサーバーの接続プールから接続をチェックアウトしようとします。 接続をチェックアウト中に Context が期限切れになった場合、メソッドはタイムアウトのエラーを返します。
接続確立
ドライバーは、新しい接続を作成する必要がある場合、メソッド呼び出しをブロックすることがあります。
ドライバーが操作を実行するための新しい接続を作成すると、Context は確立プロセスのタイムアウトを設定します。 ドライバーは、タイムアウトを Context の有効期限または接続タイムアウトのいずれか短い方に設定します。
次の例では、接続タイムアウトを1秒に、コンテキストの期限を2秒に設定します。 接続タイムアウトが短いため、確立プロセスは1秒後に期限切れになります。
opts := options.Client() opts.SetConnectTimeout(1*time.Second) client := mongo.Connect(context.TODO(), opts) ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) defer cancel() client.Database("<db>").Collection("<collection>").InsertOne(ctx, bson.D{{"x",1}})
ソケットの読み取りと書込み
ドライバーは操作のための接続を検索するときに、ソケットの読み取りまたは書き込みの期限を Context の期限またはソケット タイムアウトのいずれか短い方に設定します。
Read()
メソッドまたはWrite()
メソッドの実行後、期限前に Context をキャンセルした場合、ドライバーの動作はバージョンによって異なります。
ドライバーは、 Read()
またはWrite()
メソッドが進行中に Context がキャンセルされたかどうかをリッスンするように別の goroutine を生成します。 goroutine がキャンセルを検出すると、接続を閉じます。 保留中のRead()
メソッドまたはWrite()
メソッドはエラーを返し、ドライバーはcontext.Canceled
エラーで上書きします。
重要
1.5.0 より前のバージョンでは、ドライバーは Context のキャンセルを検出せず、 メソッドまたはRead()
Write()
メソッドが返されるのを待機します。