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