2017-09-08 4 views
2

、このクエリコマンドはバックエンドで何度も実行されます。RailsがMySQL2デフォルトWAIT_TIMEOUTとても巨大

SET NAMES utf8, @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'), @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483 

なぜRailsは一度だけ、それを実行しないのですか?

また、なぜwait_timeoutを2147483に設定したのですか?それは非常に巨大なので、何時間も、スリープモードで100時間以上も多くのクエリがあったため、サーバーがダウンしました。

私はそれを180秒に更新しなければならなかった。

default: &default 
    adapter: mysql2 
    encoding: utf8 
    pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> 
    socket: /var/run/mysqld/mysqld.sock 
    wait_timeout: 180 

どうしたのですか。何も思いつきません。

答えて

6

なぜそれがmysql2アダプタissueだ2147483

にWAIT_TIMEOUT設定しません!

mysql2_adapterこの同じWAIT_TIMEOUTを使用するが、はるかに大きい2592000 !!(2147483から今デフォルト)に のMySQL、およびデフォルトに直接渡す

# increase timeout so mysql server doesn't disconnect us 
wait_timeout = @config[:wait_timeout] 
wait_timeout = 2147483 unless wait_timeout.is_a?(Fixnum) 
variable_assignments << "@@wait_timeout = #{wait_timeout}" 

execute("SET #{variable_assignments.join(', ')}", :skip_logging) 

Reference

+0

あなたの答えはPavanにありがたいですが、なぜRailsやMySQL2が何度もクエリを実行していますか?リクエストが行われるたびに、最小でほぼ4〜5回実行されます。 –