Huy*_*Huy 4 ruby-on-rails ruby-on-rails-3
我想在Rails中执行一个非常长的查询ActiveRecord::Base.connection.execute(sql).
但是,查询会保持超时.是否可以更改此特定查询的超时值,而不必更改所有查询的超时值database.yml?
谢谢
我们必须小心超时变量,其中大多数与连接超时有关,而与查询超时本身无关.
看起来直到MySQL 5.7.4杀死长查询的唯一方法是通过mysql命令kill,我不确定你是否也会丢失连接客户端/服务器,所以也许你的Rails进程将变得无法使用.
在MySQL 5.7.4中出现了系统变量max_statement_time,它允许完全按原始问题"SELECT语句的执行超时"配置服务器.
要通过Rails的设置该系统变量,你可以使用选项变量是你的database.yml.
development:
adapter: mysql2
[...]
variables:
max_statement_time: 60000 # 1 minute
Run Code Online (Sandbox Code Playgroud)
要检查ActiveRecord连接中是否已正确设置变量,您可以在Rails控制台中运行它:
ActiveRecord::Base.connection.execute('show variables like "%max_execution_time%"').to_a
Run Code Online (Sandbox Code Playgroud)
PS:系统变量在MySQL 5.7.8中重命名为max_execution_time
PS2:我没有访问MySQL> = 5.7.4,所以我无法测试这些结论,如果有人确认,我将不胜感激.
# 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4200 次 |
| 最近记录: |