14

나는 이상한 오류 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 
+0

스레드에서 예외를 잡으려고하면 같은 오류가 발생합니까? –

+0

처리 방법은 쿼리의 특성에 따라 조금씩 다릅니다. 그들은 별도의 스레드에서 실행되기 때문에 각 스레드의 쿼리는 문맥 상 서로 고립되어 있다고 가정합니다. 이 경우에는 스레드 자체 내에서 오류를 확실히 처리 할 것입니다. 타임 아웃시 3 회의 재시도를 수행 한 다음 "thread-return-code"를 설정하고 스레드를 종료하십시오. 당신이 업데이 트를하고 있다면, 물론 거래로 포장 - ActiveRecord이 지원합니다. –

+0

계속 실행하기 위해 코드를 작성하려는 경우 블록 끝에 'rescue nil'을 추가해 보았습니까? – Stone

답변

0

database.yml에 pool : 10을 설정해야합니다. 너가 한도에 도달 한 것 같아.

관련 문제