强制停止运行activerecord,避免mysql最大执行时间

acruukt9  于 2021-09-29  发布在  Java
关注(0)|答案(1)|浏览(398)

我们的应用程序规格为:ruby 2.6.5、rails 4.2.11、mysql 5.7.33(最大执行时间=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停止查询吗?

eqfvzcg8

eqfvzcg81#

我已经解决了这个问题,

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

也许还有另一种方法。

相关问题