6

我想在 Rails 中使用ActiveRecord::Base.connection.execute(sql).

但是,查询一直超时。是否可以更改此特定查询的超时值,而不必更改所有查询的超时值database.yml

谢谢

4

2 回答 2

11

我们必须小心超时变量,它们中的大多数都与连接超时有关,而不是与查询超时本身有关。

看起来在 MySQL 5.7.4 之前,终止长查询的唯一方法是通过mysql 命令kill,我不确定您是否也会丢失连接客户端/服务器,因此您的 Rails 进程可能会变得不可用。

在 MySQL 5.7.4 中出现了系统变量max_statement_time,它允许将服务器完全配置为原始问题所问的 "The execution timeout for SELECT statements"

要通过 Rails 设置此系统变量,您可以使用选项variables is your 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,所以我无法测试这些结论,如果有人确认,我将不胜感激。

于 2016-06-21T07:13:58.320 回答
5
# 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
于 2012-12-18T18:22:20.190 回答