나는 이상한 오류 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 $!, [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
스레드에서 예외를 잡으려고하면 같은 오류가 발생합니까? –
처리 방법은 쿼리의 특성에 따라 조금씩 다릅니다. 그들은 별도의 스레드에서 실행되기 때문에 각 스레드의 쿼리는 문맥 상 서로 고립되어 있다고 가정합니다. 이 경우에는 스레드 자체 내에서 오류를 확실히 처리 할 것입니다. 타임 아웃시 3 회의 재시도를 수행 한 다음 "thread-return-code"를 설정하고 스레드를 종료하십시오. 당신이 업데이 트를하고 있다면, 물론 거래로 포장 - ActiveRecord이 지원합니다. –
계속 실행하기 위해 코드를 작성하려는 경우 블록 끝에 'rescue nil'을 추가해 보았습니까? – Stone