【问题标题】:Mysql2::Error: closed MySQL connectionMysql2::Error: 关闭 MySQL 连接
【发布时间】:2013-01-17 19:21:29
【问题描述】:

跑步:

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 有 bug 吗?

我已经读到当连接太多时会发生这种情况,而 mysql 无法处理。但是为什么 PgSql 不会发生这种情况呢?

附言。我正在使用 Amazon RDS,如果这有影响的话。

【问题讨论】:

标签: mysql ruby-on-rails ruby-on-rails-3 amazon-rds


【解决方案1】:

当然,你在Timeout.timeout(1) 块中这样做,我认为你应该延长超时时间。

【讨论】:

  • 没关系。在大多数情况下,Web 应用程序会通过许多连接访问数据库。相同的命令不会导致 PgSql 出错
【解决方案2】:

它在 MySql 中而不是 PgSql 中给出错误的原因是 sleep 是一个有效的 Mysql 函数而不是一个有效的 Pgsql 函数。后者中正确的函数是 pg_sleep。 也就是说,查询休眠 2 秒,而在 Ruby 代码中您将执行时间限制为 1 秒,因此会引发超时异常。对于 Pg 情况,它应该给出另一种异常,例如“sleep is not a valid pgsql function”

【讨论】:

    猜你喜欢
    • 2012-07-31
    • 2016-03-12
    • 1970-01-01
    • 2013-08-13
    • 1970-01-01
    • 2016-04-04
    • 2017-06-18
    • 1970-01-01
    • 2014-12-18
    相关资源
    最近更新 更多