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

d8a*_*nja 8 mysql timeout r jdbc r-dbi

我意识到了

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.)

但我的团队刚刚经历了一个锁定的表,我们进入了MySQL kill pid,我想知道 - 有没有办法超时使用该DBI包提交的查询?

我正在寻找,找不到相应的

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

我尝试了这个,并使用和不使用参数集来分析函数,它似乎没有做任何事情; 为什么会这样,如果dbClearResult总是在玩?

Tec*_*e01 4

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

建议的解决方案:

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

注意。返回的查询数据可能太大而无法使用,但这是另一个问题。

MySql 示例:

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


MAX_EXECUTION_TIME(N)
Run Code Online (Sandbox Code Playgroud)

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

SELECT /*+ MAX_EXECUTION_TIME(1000) */ * FROM t1 INNER JOIN t2 WHERE ...
Run Code Online (Sandbox Code Playgroud)

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

MAX_EXECUTION_TIME提示适用如下:

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

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

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


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