Mysql2 :: Ошибка: закрытое соединение MySQL - PullRequest
0 голосов
/ 09 марта 2012

Running:

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, если это имеет значение.

Ответы [ 2 ]

0 голосов
/ 17 января 2013

Причина, по которой он выдает ошибку в MySql, но не в PgSql, заключается в том, что sleep является допустимой функцией Mysql, но не допустимой функцией Pgsql.Правильная функция в последнем - это pg_sleep.Тем не менее, запрос спит в течение 2 секунд, в то время как в коде Ruby вы ограничиваете выполнение на 1 секунду, поэтому возникает исключение тайм-аута.Для случая Pg это должно дать исключение другого типа, что-то вроде «сон не является допустимой функцией pgsql»

0 голосов
/ 09 марта 2012

Конечно, вы делаете это в блоке Timeout.timeout(1), я думаю, вам следует увеличить время ожидания.

...