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

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

我们的应用程序规格为:ruby 2.6.5、rails 4.2.11、mysql 5.7.33(最大执行时间=1200000,20分钟)
对于海量数据,例如公司数据,有时我们在查询时需要花费很长时间。所以我决定用 Timeout::timeout 强制停止查询,但似乎不起作用。
这是示例代码

  1. begin
  2. max_time = 600 # 10minutes
  3. Timeout::timeout(max_time) do
  4. company = Company.where(location: 'West').last
  5. end
  6. rescue => e
  7. company = nil
  8. end

我们的期望是,如果查询仍在处理,它应该在10分钟内停止。但它会在20分钟后停止,mysql的最大超时时间。
我已经检查过了,它可以在5秒钟内停止

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

但这样,它仍然会在10秒内停止

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

可以用rails停止查询吗?

eqfvzcg8

eqfvzcg81#

我已经解决了这个问题,

  1. begin
  2. query = <<-SQL
  3. SELECT /*+ MAX_EXECUTION_TIME(600000) */ id, location
  4. FROM companies
  5. WHERE location = 'West'
  6. ORDER BY id DESC LIMIT 1;
  7. SQL
  8. result = Company.find_by_sql(query)
  9. company = result.last
  10. rescue => e
  11. company = nil
  12. end

也许还有另一种方法。

相关问题