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 后,我的印象是在上面的例子中,底层查询会在执行过程中被取消,但情况似乎并非如此。 返回仍然需要 10 秒(并且查询显示在 MySQL 进程列表中),尽管出现错误sql: Rows are closed
。 这是否意味着驱动程序实际上无法取消在服务器上运行的底层查询?
你好,我是#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
看起来它处于里程碑 btw。 对于其他向服务添加熔断机制并发现查询在 mysql 中持续存在的人,您可能希望观察这些问题并对这些问题做出反应,以便维护人员知道有兴趣。
我的大多数同行都希望这能奏效,因为他们更熟悉 postgres,其中已知此类工作流可以工作,更容易实现/由查询会话本机支持,而无需建立更多连接。
现在,我在我的组织中记录了 mysql 在这里不太友好,对此类功能的有效支持将保证 mysql 服务器更改其连接接口。
解决方法会很好,因为我们目前使用 mysql 太多了。 :-)
https://medium.com/@rocketlaunchr.cloud/canceling -mysql-in-go-827ed8f83b30
最有用的评论
有没有计划修复那个 TODO?