强制停止 运行 ActiveRecord,避免 mysql max_execution_time

Force stop running ActiveRecord, avoid mysql max_execution_time

我们的应用规格为:Ruby 2.6.5,Rails 4.2.11,MySQL 5.7.33(max_execution_time = 1200000,20 分钟)

数据量很大,比如公司数据,有时候我们查询的时候会花很长时间。所以我决定用Timeout::timeout强制停止查询,但是好像不行。

这是示例代码

begin
  max_time = 600 # 10minutes

  Timeout::timeout(max_time) do
    company = Company.where(location: 'West').last
  end
rescue => e
  company = nil
end

预计,如果查询仍在处理中,它应该在 10 分钟内停止。但它会在 20 分钟后停止,最大超时时间为 MySQL。

我已经用这个检查过了,它可以在 5 秒内停止

Timeout::timeout(5) { sleep(10) }

但是有了这个,它仍然会在 10 秒后停止

Timeout::timeout(5) { Company.select('SLEEP(10)').limit(1) }

是否可以使用 rails 停止查询?

我已经解决了这个问题,

begin
  query = <<-SQL
    SELECT /*+ MAX_EXECUTION_TIME(600000) */ id, location
    FROM companies
    WHERE location = 'West'
    ORDER BY id DESC LIMIT 1;
  SQL

  result = Company.find_by_sql(query)
  company = result.last
rescue => e
  company = nil
end

也许还有另一种方法。