Я обнаружил странную ошибку undefined method `run_callbacks' for nil:NilClass
и смог воспроизвести ее с помощью этого примера кода.
В основном проблема в том, что активная запись получает тайм-аут (по умолчанию 5 с), но выдает неопределенное исключение метода, что мне кажется неправильным
Но в любом случае, как правильно справиться с этим? В моем реальном коде у меня есть куча потоков, которые заняты выполнением реальной работы, но иногда я сталкиваюсь с этой ошибкой. Итак, представьте, 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 $!, $@
end
Если я запускаю этот код как есть, я получаю исключение. Если я уменьшу сон до 4 с, я не буду. Вот вывод с 6-секундным сном.
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