ctx, cancel := context.WithCancel(context.Background())
// Cancel 5 seconds in.
go func() {
time.Sleep(time.Second * 5)
cancel()
}()
// This query should take 10 seconds to return.
rows, err := dbt.db.QueryContext(ctx, "SELECT v, SLEEP(10) FROM test LIMIT 1")
fmt.Println(rows, err)
https://github.com/go-sql-driver/mysql/issues/496とhttps://github.com/go-sql-driver/mysql/pull/608を読んだ後、私は上記の例では、基になるクエリは実行中にキャンセルされますが、そうではないようです。 エラーsql: Rows are closed
表示されますが、戻るまでに10秒かかります(クエリはMySQLプロセスリストに表示されます)。 これは、ドライバーがサーバーで実行されている基になるクエリを実際にキャンセルできないことを意味しますか?
こんにちは、私は#608の作者です。
これは、ドライバーがサーバーで実行されている基になるクエリを実際にキャンセルできないことを意味しますか?
はい、私の実装はサーバーで実行されているクエリを強制終了しません。
まだTODOステータスです。
参考までに、ヒントを使用してクエリの実行時間を制限できます。
https://dev.mysql.com/doc/refman/5.7/en/optimizer-hints.html#optimizer -hints-execution-time
@ shogo82148 @methane感謝。
そのTODOを修正する予定はありますか?
そのTODOを修正する予定はありますか?
https://github.com/go-sql-driver/mysql/pull/791
マイルストーンのようです。 サービスに回路遮断を追加し、クエリがmysqlで存続することに気付いた他の人にとっては、これらの問題を監視して対応し、メンテナが関心があることを認識できるようにすることができます。
私の仲間のほとんどは、このようなワークフローが機能することが知られているpostgresに精通しており、実装がより簡単で、接続を増やすことなくクエリセッションによってネイティブにサポートされているため、これが機能することを期待していました。
今のところ、私は自分の組織でmysqlがここではあまり友好的ではなく、そのような機能を効果的にサポートすることでmysqlサーバーが接続インターフェースを変更する必要があることを文書化しています。
現在mysqlを使用しているので、回避策があれば便利です。 :-)
https://medium.com/@rocketlaunchr.cloud/canceling -mysql-in-go-827ed8f83b30
最も参考になるコメント
そのTODOを修正する予定はありますか?