14

Tôi đã theo dõi một lỗi lạ undefined method `run_callbacks' for nil:NilClass và có thể tạo lại mã này với mã mẫu này.cách thích hợp để xử lý thời gian chờ cho bản ghi hoạt động với một hồ bơi kết nối là gì?

Về cơ bản, sự cố là bản ghi đang hoạt động đang bị hết thời gian chờ (mặc định là 5s) nhưng lại ném ngoại lệ phương thức chưa xác định, điều này có vẻ sai với tôi.

Nhưng dù sao, cách nào đúng để xử lý việc này? Trong mã thực sự của tôi, tôi có một loạt các chủ đề đang bận làm công việc thực nhưng đôi khi tôi nhấn lỗi này. Vì vậy, hãy tưởng tượng puts là mã thực. Tôi muốn các chủ đề hiện tại tiếp tục hoạt động khi điều này xảy ra.

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 

Nếu tôi chạy mã này như tôi có ngoại lệ. Nếu tôi giảm giấc ngủ xuống còn 4 thì không. Đây là đầu ra với giấc ngủ 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

Bạn có gặp lỗi tương tự không, nếu bạn cố gắng nắm bắt ngoại lệ bên trong chuỗi? –

+0

Cách xử lý phụ thuộc một chút vào bản chất của các truy vấn của bạn. Tôi giả sử rằng vì chúng được chạy trong các luồng riêng biệt, các truy vấn trong mỗi luồng được phân tách theo ngữ cảnh với nhau. Trong trường hợp này, tôi chắc chắn sẽ xử lý lỗi trong chính chuỗi đó. Làm 3 thử lại trên timeouts và sau đó thiết lập một "thread-return-code" và thoát khỏi thread. Nếu bạn đang thực hiện cập nhật, thì tất nhiên gói chúng vào một giao dịch - ActiveRecord hỗ trợ điều này. –

+0

Nếu bạn chỉ muốn mã để tiếp tục chạy, bạn đã thử thêm 'rescue nil' vào cuối khối của mình chưa? – Stone

Trả lời

0

Bạn nên đặt pool: 10 trong database.yml của mình. Có vẻ như bạn đã đạt đến giới hạn.

Các vấn đề liên quan