我意识到
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
总是在起作用,为什么会这样?
如果我正确阅读了您的问题,我的感觉是您需要依靠MySQL服务器来实现所需的查询超时。为什么?dbQuery
向您希望服务器运行查询和超时的服务器发送客户端请求。
建议的解决方案:
在提交给 MySQL 数据库的查询中包含语句执行提示。
铌。返回的查询数据可能太大,无法使用,但这是一个不同的问题。
MySql 示例:
只有 SELECT语句才允许使用MAX_EXECUTION_TIME提示。它对 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语句,因此将被忽略。
我希望上述方法可以帮助您朝着正确的方向前进。