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が表示されます。これにより、元の質問が「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 にアクセスできないため、これらの結論をテストすることはできません。誰かがそれを確認していただければ幸いです。

于 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 に答える