【问题标题】:Force stop running ActiveRecord, avoid mysql max_execution_time强制停止运行ActiveRecord,避免mysql max_execution_time
【发布时间】:2021-09-25 10:42:57
【问题描述】:

我们的应用具有以下规格: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 停止查询?

【问题讨论】:

    标签: mysql ruby-on-rails ruby ruby-on-rails-4


    【解决方案1】:

    我已经解决了这个问题,

    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
    

    也许还有另一种方法。

    【讨论】:

      猜你喜欢
      • 2019-09-01
      • 2010-10-12
      • 2015-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多