2012-03-09 18 views
0
を閉じ

実行:Mysql2 ::エラー:MySQLの接続

Timeout.timeout(1) { User.find_by_sql('SELECT sleep(2) FROM users;') } 

は以下を返します:

User Load (1004.2ms) SELECT sleep(2) FROM users; 
ActiveRecord::StatementInvalid: : execution expired: SELECT sleep(2) FROM users; 
    from /Users/Chris/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.3/lib/active_record/connection_adapters/mysql2_adapter.rb:687:in `query' 
    from /Users/Chris/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.3/lib/active_record/connection_adapters/mysql2_adapter.rb:687:in `block in exec_query' 
    from /Users/Chris/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.3/lib/active_record/connection_adapters/abstract_adapter.rb:244:in `block in log' 
    from /Users/Chris/.rvm/gems/ruby-1.9.2-p290/gems/activesupport-3.1.3/lib/active_support/notifications/instrumenter.rb:21:in `instrument' 
    from /Users/Chris/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.3/lib/active_record/connection_adapters/abstract_adapter.rb:239:in `log' 
    from /Users/Chris/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.3/lib/active_record/connection_adapters/mysql2_adapter.rb:685:in `exec_query' 
    from /Users/Chris/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.3/lib/active_record/connection_adapters/mysql2_adapter.rb:679:in `select' 
    from /Users/Chris/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.3/lib/active_record/connection_adapters/abstract/database_statements.rb:18:in `select_all' 
    from /Users/Chris/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.3/lib/active_record/connection_adapters/abstract/query_cache.rb:63:in `select_all' 
    from /Users/Chris/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.3/lib/active_record/base.rb:470:in `find_by_sql' 
    from (irb):1:in `block in irb_binding' 
    from /Users/Chris/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/timeout.rb:58:in `timeout' 
    from (irb):1 
    from /Users/Chris/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.1.3/lib/rails/commands/console.rb:45:in `start' 
    from /Users/Chris/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.1.3/lib/rails/commands/console.rb:8:in `start' 
    from /Users/Chris/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.1.3/lib/rails/commands.rb:40:in `<top (required)>' 
    from script/rails:6:in `require' 
    from script/rails:6:in ` 

pgSQLのでは発生していないよう次。 Mysql2またはActiveRecordにバグはありますか?

これは、接続が多すぎてmysqlが処理できない場合に発生することがあります。しかし、なぜこれはPgSqlでは起こりませんか?

PS。私はAmazon RDSを使用しています。

+0

これは私のために働いています:config/database.ymlで、 ':reconnect'を' true'に変更し、 ':pool'を' 20'にします。同様の質問を参照してください:http://stackoverflow.com/questions/11773930/ruby-exception-occured-mysql2error-closed-mysql-connection/13714846#13714846 –

答えて

0

もちろん、Timeout.timeout(1)ブロックでこれを行うと、タイムアウトを長くする必要があると思います。

+0

それは問題ではありません。ほとんどの場合と同様に、Webアプリケーションは多くの接続でdbにヒットします。同じコマンドでPgSqlでエラーが発生することはありません –

+0

しかし、タイムアウトエラーが発生しました。 – user973254

0

MySqlではなくPgSqlでエラーが発生する理由は、sleepが有効なMysql関数ですが、有効なPgsql関数ではないということです。後者の正しい関数はpg_sleepです。 つまり、クエリは2秒間スリープしますが、Rubyコードでは実行を1秒間制限するため、タイムアウト例外が発生します。 Pgの場合、 "sleepは有効なpgsql関数ではありません"のような別の種類の例外を与えるはずです