2012-03-09 9 views
0

Course:mysql2 :: Erreur: connexion fermée MySQL

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

Renvoie les éléments suivants:

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 ` 

Ce qui suit ne semble pas se produire avec PGSQL. Y a-t-il un bug dans Mysql2 ou ActiveRecord? J'ai lu que cela se produit quand il y a trop de connexions, que mysql ne parvient pas à gérer. Mais pourquoi cela ne se produit-il pas avec PgSql alors?

PS. J'utilise Amazon RDS, si cela fait une différence.

+0

Cela a fonctionné pour moi: Dans config/database.yml, changez ': reconnect' en' true', et ': pool' à' 20'. voir la question similaire: http://stackoverflow.com/questions/11773930/ruby-exception-occured-mysql2error-closed-mysql-connection/13714846#13714846 –

Répondre

0

Bien sûr, vous faites cela dans le bloc Timeout.timeout(1), je pense que vous devriez faire un timeout plus long.

+0

Cela ne devrait pas avoir d'importance. Comme dans la plupart des cas, une application web va frapper la base de données avec de nombreuses connexions. La même commande ne provoque pas d'erreur avec PgSql –

+0

Mais néanmoins, erreur de timeout a été soulevée. – user973254

0

La raison pour laquelle il donne une erreur dans MySql mais pas PgSql est que sleep est une fonction Mysql valide mais pas une fonction Pgsql valide. La fonction correcte dans ce dernier est pg_sleep. Cela dit, la requête dort pendant 2 secondes alors que dans le code Ruby vous limitez l'exécution de 1 seconde, donc une exception de délai est levée. Pour le cas Pg, il devrait donner une exception d'un autre genre, quelque chose comme "sleep n'est pas une fonction pgsql valide"