9

我意识到

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总是在玩?

4

1 回答 1

4

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

建议的解决方案:

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

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

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语句并被忽略。


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

于 2017-07-09T17:31:18.100 回答