【问题标题】:Is there a way to timeout a MySql query when using DBI and dbGetQuery?使用 DBI 和 dbGetQuery 时有没有办法让 MySql 查询超时?
【发布时间】:2017-12-07 02:51:47
【问题描述】:

我意识到了

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 一直在起作用,为什么会这样呢?

【问题讨论】:

  • 这里有一个解决方案:stackoverflow.com/questions/7891073/…。一般的想法是分叉命令并在主线程中使用Sys.time(),如果需要太长时间,则使用tools::pskill()
  • 您使用的是哪个引擎(MyISAM 或 InnoDB)?连接器是否等待整个结果集?还是以增量方式提供数据?如果可能,这种选择会对您的问题产生直接影响。
  • d8aninja 提供的信息是否有助于解决您的问题?我只是在检查我是否正确理解了您的问题。
  • 是的,你做到了! @Technophobe01
  • 哦,太好了。总是乐于提供帮助 - 只是检查。保重。

标签: mysql r jdbc timeout r-dbi


【解决方案1】:

如果我正确阅读了您的问题,我的感觉是您需要依靠您的 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 语句并被忽略。


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

【讨论】:

    猜你喜欢
    • 2023-04-08
    • 2011-09-21
    • 1970-01-01
    • 2012-11-22
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    相关资源
    最近更新 更多