Каков правильный способ обработки тайм-аутов для активной записи с пулом соединений?

Я обнаружил странную ошибку 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

Ответы

Ответ 2

Вы должны установить пул: 10 в вашей базе данных .yml. Похоже, вы достигли предела.