9.4 クエリーをキャンセルする

「Webアプリケーションで一定時間内にレスポンスを返せなかった」「長い時間のかかるバッチ処理用のクエリーを発行したが処理が終わらない」など、クエリーをキャンセルしたい場面がいくつかあります。クエリーをキャンセルするには、コンテキストを使うのが一般的です。

9.4.1 コンテキスト付きのdatabase/sql関数を使用する

Go 1.8 から database/sql パッケージがコンテキストに対応しました。クエリーをタイムアウトしてキャンセルしたい場合などは、 context.WithCancel()context.WithTimeout() を使用してキャンセルするのが良いでしょう。ただし使用しているデータベースのドライバーがクエリーのキャンセルをサポートしている必要があります。

note

クエリーのキャンセルを試みるときは、使用しているデータベースドライバーがキャンセルをサポートしているか確認が必要です。 たとえば一昔に主流だったPostgreSQLドライバーである lib/pg では、クエリーがキャンセルできない、という以下のようなIssueがあります。

リスト9-9: context.WithTimeout でクエリーをキャンセル
	ctx, cancel := context.WithTimeout(context.Background(), 5