我想在 Rails 中使用ActiveRecord::Base.connection.execute(sql)
.
但是,查询一直超时。是否可以更改此特定查询的超时值,而不必更改所有查询的超时值database.yml
?
谢谢
我想在 Rails 中使用ActiveRecord::Base.connection.execute(sql)
.
但是,查询一直超时。是否可以更改此特定查询的超时值,而不必更改所有查询的超时值database.yml
?
谢谢
我们必须小心超时变量,它们中的大多数都与连接超时有关,而不是与查询超时本身有关。
看起来在 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,所以我无法测试这些结论,如果有人确认,我将不胜感激。
# 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