Ответ 1
В этой области для ActiveRecord была проделана большая работа, так как этот вопрос был опубликован. Вот несколько хороших объяснений: http://bibwild.wordpress.com/2012/03/15/activerecord-concurrency-currently-good-news-and-bad/
Я обнаружил странную ошибку undefined method `run_callbacks' for nil:NilClass
и смог воспроизвести ее с помощью этого образца кода.
В основном проблема заключается в том, что активная запись получает тайм-аут (по умолчанию - 5 с), но бросает исключение метода undefined, что кажется мне неправильным.
Но так или иначе, какой правильный способ справиться с этим? В моем реальном коде у меня есть куча потоков, которые заняты реальной работой, но иногда я ударяю эту ошибку. Итак, представьте, что puts
- это реальный код. Я хочу, чтобы существующие потоки продолжали работать, когда это происходит.
threads = []
10.times do |n|
threads << Thread.new {
ActiveRecord::Base.connection_pool.with_connection do |conn|
puts "#{n} #{conn}"
res = conn.execute("select sleep(6)", :async => true)
end
}
end
# block and wait for all threads to finish
threads.each { |t| puts "joined" ; t.join }
rescue Exception => e
puts $!, [email protected]
end
Если я запустил этот код, я получаю исключение. Если я уменьшу сон до 4 с, я этого не сделаю. Здесь вывод с 6s сна.
joined
0 #<ActiveRecord::ConnectionAdapters::Mysql2Adapter:0xb73c6380>
1 #<ActiveRecord::ConnectionAdapters::Mysql2Adapter:0xb73c5548>
2 #<ActiveRecord::ConnectionAdapters::Mysql2Adapter:0xb73c4fe4>
3 #<ActiveRecord::ConnectionAdapters::Mysql2Adapter:0xb73c4a80>
4 #<ActiveRecord::ConnectionAdapters::Mysql2Adapter:0xb73c451c>
joined
joined
joined
joined
joined
undefined method `run_callbacks' for nil:NilClass
/usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/connection_adapters/abstract/connection_pool.rb:212:in `checkin'
sqltst.rb:31:in `join'
sqltst.rb:31
sqltst.rb:31:in `each'
sqltst.rb:31
В этой области для ActiveRecord была проделана большая работа, так как этот вопрос был опубликован. Вот несколько хороших объяснений: http://bibwild.wordpress.com/2012/03/15/activerecord-concurrency-currently-good-news-and-bad/
Вы должны установить пул: 10 в вашей базе данных .yml. Похоже, вы достигли предела.