强制停止 运行 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
也许还有另一种方法。
我们的应用规格为: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
也许还有另一种方法。