我明白了
dbGetQuery 附带一个默认实现,它调用 dbSendQuery,然后调用 dbFetch,确保结果始终由 dbClearResult 释放。
和
dbClearResult 释放与结果集关联的所有资源(本地和远程)。在某些情况下(例如,非常大的结果集),这可能是避免耗尽资源(内存、文件描述符等)的关键步骤
但我的团队刚刚经历了一个锁定的表,我们进入 MySQL 以kill pid
我想知道 - 是否有一种方法可以使使用 DBI
提交的查询超时> 包裹?
我正在寻找但找不到
的等价物dbGetQuery(conn = connection, 'select stuff from that_table', timeout = 90)
我尝试了这个,并在有和没有参数集的情况下分析了函数,但它似乎没有做任何事情;如果 dbClearResult
一直在运行,为什么会这样呢?
最佳答案
如果我没看错您的问题,我的感觉是您需要依靠 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 语句并被忽略。
我希望上述方法能帮助您朝着正确的方向前进。
关于mysql - 使用 DBI 和 dbGetQuery 时有没有办法使 MySql 查询超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44892294/