Как правильно обрабатывать тайм-ауты для активной записи с пулом соединений? - PullRequest
14 голосов
/ 06 февраля 2011

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

Ответы [ 2 ]

1 голос
/ 18 апреля 2012

В этой области для ActiveRecord была проделана большая работа с момента публикации этого вопроса.Вот несколько хороших объяснений: http://bibwild.wordpress.com/2012/03/15/activerecord-concurrency-currently-good-news-and-bad/

0 голосов
/ 18 апреля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...