2012-03-09 100 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 – 2012-12-05 01:22:14

回答

0

当然,你在Timeout.timeout(1)区块做这个,我认为你应该让超时时间更长。

+0

它应该没关系。在大多数情况下,Web应用程序会通过多个连接来访问数据库。相同的命令不会导致PgSql错误 – 2012-03-09 16:16:37

+0

但是,仍然引发超时错误。 – user973254 2012-03-09 16:19:31

0

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