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

时间:2017-07-03 18:54:56

标签: mysql r jdbc timeout 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始终在发挥作用,为什么会这样呢?

1 个答案:

答案 0 :(得分:3)

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

提议的解决方案:

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

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

MySql示例:

SELECT 语句允许 MAX_EXECUTION_TIME 提示。它给出了一个限制N(一个超时值,以毫秒为单位),表示在服务器终止它之前允许执行SQL语句的时间。

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 语句,但会被忽略。

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