使用 DBI 和 dbGetQuery 时,有没有办法使 MySql 查询超时?

Is there a way to timeout a MySql query when using DBI and dbGetQuery?

我意识到

dbGetQuery comes with a default implementation that calls dbSendQuery, then dbFetch, ensuring that the result is always freed by dbClearResult.

dbClearResult frees all resources (local and remote) associated with a result set. In some cases (e.g., very large result sets) this can be a critical step to avoid exhausting resources (memory, file descriptors, etc.)

但是我的团队刚刚经历了 table 的锁定,我们进入了 MySQL 到 kill pid,我想知道 - 有没有办法使使用 [= 提交的查询超时=14=]包裹?

我正在寻找但找不到

的等价物

dbGetQuery(conn = connection, 'select stuff from that_table', timeout = 90)

我试过了,并在有和没有参数集的情况下对函数进行了分析,但它似乎没有做任何事情;如果 dbClearResult 总是在玩,为什么会这样?

如果我没看错你的问题,我的感觉是你需要依赖 MySQL 服务器来实现所需的查询超时。为什么? dbQuery 正在向您希望服务器 运行 查询和超时的服务器发送客户端请求。

建议的解决方案:

在您提交给 MySQL 数据库的查询中包含语句执行提示。

nb.返回的查询数据可能太大,您无法使用,但那是另一个问题。

MySql 示例:

MAX_EXECUTION_TIME 提示仅允许用于 SELECT 语句。它对 SQL 语句在服务器终止之前允许执行的时间设置了一个限制 N(以毫秒为单位的超时值)。


MAX_EXECUTION_TIME(N)

超时为 1 秒(1000 毫秒)的示例:

SELECT /*+ MAX_EXECUTION_TIME(1000) */ * FROM t1 INNER JOIN t2 WHERE ...

MAX_EXECUTION_TIME(N) 提示设置 N 毫秒的语句执行超时。如果此选项不存在或 N 为 0,则应用 max_execution_time 系统变量建立的语句超时。

MAX_EXECUTION_TIME提示适用如下:

对于具有多个SELECT关键字的语句,例如联合或带有子查询的语句,MAX_EXECUTION_TIME适用到整个语句并且必须出现在第一个 SELECT.

之后

适用于只读SELECT语句。非只读语句是那些调用存储函数的语句,该函数作为副作用修改数据。

它不适用于存储程序中的 SELECT 语句,将被忽略。


希望以上方法能帮助您朝着正确的方向前进。