我使用Parallel寶石與Rails3中,並與MySQL線程獲取的問題,即使是一個簡單的一行:的ActiveRecord :: StatementInvalid的:mysql ::錯誤:MySQL服務器已消失:(使用並行寶石)
Parallel.each(User.all, :in_processes => 1) { |r| puts r.username }
它交替工作,然後通過第二次失敗。以下是錯誤我得到:
ruby-1.8.7-p330 :035 > Parallel.each(User.all, :in_processes => 1) { |r| puts r.username }
ActiveRecord::StatementInvalid: Mysql::Error: MySQL server has gone away: SELECT `users`.* FROM `users`
from /Users/kimptoc/.rvm/gems/[email protected]/gems/activerecord-3.0.3/lib/active_record/connection_adapters/abstract_adapter.rb:202:in `log'
from /Users/kimptoc/.rvm/gems/[email protected]/gems/activerecord-3.0.3/lib/active_record/connection_adapters/mysql_adapter.rb:289:in `execute'
from /Users/kimptoc/.rvm/gems/[email protected]/gems/activerecord-3.0.3/lib/active_record/connection_adapters/mysql_adapter.rb:619:in `select'
from /Users/kimptoc/.rvm/gems/[email protected]/gems/activerecord-3.0.3/lib/active_record/connection_adapters/abstract/database_statements.rb:7:in `select_all'
from /Users/kimptoc/.rvm/gems/[email protected]/gems/activerecord-3.0.3/lib/active_record/connection_adapters/abstract/query_cache.rb:56:in `select_all'
from /Users/kimptoc/.rvm/gems/[email protected]/gems/activerecord-3.0.3/lib/active_record/base.rb:467:in `find_by_sql'
from /Users/kimptoc/.rvm/gems/[email protected]/gems/activerecord-3.0.3/lib/active_record/relation.rb:64:in `to_a'
from /Users/kimptoc/.rvm/gems/[email protected]/gems/activerecord-3.0.3/lib/active_record/relation/finder_methods.rb:143:in `all'
from /Users/kimptoc/.rvm/gems/[email protected]/gems/activerecord-3.0.3/lib/active_record/base.rb:439:in `__send__'
from /Users/kimptoc/.rvm/gems/[email protected]/gems/activerecord-3.0.3/lib/active_record/base.rb:439:in `all'
from (irb):35
from (null):0
如果我做不平行的版本,它工作得很好:
User.all.each { |r| puts r.username }
我使用的是MySQL的寶石,但試圖mysql2和的MySQLPlus。
在OSX上運行。
我在想如何ActiveRecord和MySQL gem與線程一起工作的問題。
從我讀過的內容來看,這可能是我需要調整mysql設置,以使其更具併發性。儘管替代寶石似乎更好地解決了處理併發問題。
我提出這與寶石查詢 - https://github.com/grosser/parallel/issues/9#comment_844380 - 但這似乎更像是如何設置MySQL的紅寶石的併發訪問一個根本性的問題...
所以,我的問題是 - 有一個Rails3和MySQL的併發數據庫訪問權限配置?
謝謝,克里斯
編輯
什麼似乎是工作被分成2個查詢,一到得到的ID,然後通過ID的並聯環路內循環,再訪問通過id實體。
ids = User.all.map { |u| u.id }
Parallel.each(ids, :in_processes => 1) do |uid|
ActiveRecord::Base.connection.reconnect!
r = User.find(uid)
puts r.username
end
謝謝 - 有道理,會嘗試一下。 – 2011-03-11 15:18:17
嗯 - 仍然出現錯誤,我想它是由於集合直接鏈接到數據庫。也許我應該拔出ID然後重新訪問循環內的對象... – 2011-03-11 17:51:40