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が表示されます。これにより、元の質問が「SELECT ステートメントの実行タイムアウト」を求めているものに正確にサーバーを構成できます。
Rails でこのシステム変数を設定するには、オプションの変数を使用できます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