在Rails中设置SQL查询的超时值

时间:2012-12-18 17:53:27

标签: ruby-on-rails ruby-on-rails-3

我想使用ActiveRecord::Base.connection.execute(sql)在Rails中执行一个非常长的查询。

但是,查询会保持超时。是否可以更改此特定查询的超时值,而不必更改database.yml中所有查询的超时值?

由于

2 个答案:

答案 0 :(得分:8)

我们必须小心 timeout 变量,其中大多数与连接超时有关,而与查询超时本身无关。

看起来直到MySQL 5.7.4杀死长查询的唯一方法是通过mysql command kill,我不确定你是否也会丢失连接客户端/服务器,所以你的Rails进程可能会变得无法使用。

在MySQL 5.7.4中出现了系统变量max_statement_time,它允许完全根据原始问题的要求配置服务器" SELECT语句的执行超时"

要通过Rails设置此系统变量,您可以使用variables选项作为database.yml

development:
  adapter: mysql2
  [...]
  variables:
    max_statement_time: 60000 # 1 minute

要检查ActiveRecord连接中是否已正确设置变量,您可以在Rails控制台中运行它:

ActiveRecord::Base.connection.execute('show variables like "%max_execution_time%"').to_a

PS:系统变量在MySQL 5.7.8中重命名为max_execution_time

PS2:我没有访问MySQL> = 5.7.4,所以我无法测试这些结论,如果有人确认,我将不胜感激。

答案 1 :(得分:3)

# in database.yml
production: &prod
  adapter: whatever
  timeout: 5000 

long_connection_production:
  <<: prod
  timeout: 10000

# app/models/long_connection.rb
class LongConnection < ActiveRecord::Base
  establish_connection "long_connection_#{Rails.env}"

  def self.do_thing_that_takes_a_long_time
    connection.execute(sql)
  end
end