2011-03-29 20 views
5

Burada açık uçlu bir soruyla ilgili bir sorun var, bu yüzden önce sorunu açıklayacağım. Veri eşzamanlama işlerini bir kuyruktan atması beklenen bir Resque çalışanımız var, nedenleri iki kat, Cron (ve Rails ortam önyükleme süresi üzerinden-ve ötesine ödeme yapıyor) berbat, ve alternatif kuyruklar, iyi Github yaptı Onlar announced Resque zaman onlara karşı oldukça iyi durumda. Ayrıca (, Redis zaman serisi işlevsellik zaten ... biz de RRDTool & vb içine TS verilerini karıştırmak bizim altyapı, büyük bir rol oynar İşte Çatal/dişli uygulama içinde çalışırken ActiveRecord yeniden bağlanamıyor mu?

işler arasında tipik bir üç saat, sorun ama Personel, herhangi bir zamanda işleri zamanlayabilirsiniz ... böylece sıra), PostgreSQL sunucusu uzağa gider. Tedavi etmek için yeterince kolay, ilgili ortamın altında reconnect: true ayarının beklediğim gibi çalışmasını beklerim. few places reconnect: true'un fork() kullanan uygulamalar için çalışmaz. Doğal olarak, Resque'un, işçilere başlaması için bunu yapar… Anlamadığım kısım, ActiveRecord'un yeniden bağlanmasının neden bu koşullar altında çalışamayacağıdır?

Ben MySQL Adapter ve ActiveRecord içinde PostgreSQL Adapter farklıdır reconnect! uygulamalarını farkettim ... ama her iki durumda da ben ActiveRecord reconnect: true yapılandırma çalışması beklenir.

sorun (böylece veritabanına bağlantı asılı) yeterince çocuk süreç var olduğunda, bu ebeveyn tarafından oluşturulan kolları dosyayı kapatır net görünüyor - bu mümkündür, böyle bir bir dosya tanıtıcısından kapatmak için ActiveRecord bağlantının sonlandırıldığını algılama yolu? Ne olursa olsun için de var

, bir pastie olarak, Github bulabildim bir ActiveRecord aware fork() - bu denenmemiş, ama bunun işe yaradığını varsayalım (cari Raylar ile hiç denemedim ..)

Benim sorum daha, fork() niçin AR yeniden otomatik olarak bağlanamıyorsunuz? (ve son olarak - Bu soruna sahip olan tek kişi ben olamıyorum; Resque ile PGSQL kullanarak tebeşirleniyorum!)

cevap

6

"Neden yeniden bağlanamıyor?"


Resque.after_fork do |job| 
    ActiveRecord::Base.connection.reconnect! 
end 

Güncelleme::" ama ne size yardımcı olabilir başlatma aşamasında bir yere koymak aşağıdaki kod olduğunu düşünüyorum tekrar bağlanma ile ilgili olarak - o MySQL tek özelliği var gibi görünüyor. Bu, mysql bağdaştırıcısında nasıl kullanılır: https://github.com/rails/rails/blob/master/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb#L848 Gördüğünüz gibi, temel sürücünün yeniden bağlanma özelliğini kullanır. Öte yandan https://github.com/kwatch/mysql-ruby/blob/master/ext/mysql.c#L923

, reconnect seçeneğiyle açısından hiçbir şey yapmaz postgresql adaptörü, sen de https://github.com/rails/rails/blob/master/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb

görebilirsiniz PostgreSQL sitesi açıkça "açık libpq bağlantısı olan bir süreç çatallamak söylüyor öngörülemeyen sonuçlara yol açabilir "- http://www.postgresql.org/docs/9.0/interactive/libpq-connect.html Ayrıca C sürücüsünün herhangi bir yeniden bağlantı özelliği sağlamadığı da açıktır.

+0

Roman, tabii - Geçici çözümüm var, ama özellikle yeniden bağlanmanın nedenini arıyorum: true çalışmıyor.Eşzamanlılık (activerecord'un "allowconcurrency" bayrağı) ile ilgili bir şey olup olmadığını merak ediyorum - ve ilk bağlantının hala bağlı olduğunu farkettim… ama gerçekten kaybettim. –

+0

Eh, activerecord koduna bakarak, ne söyleyebilirim, PostgreSQL adaptörü için 'reconnect' seçeneği desteklenmiyor. – Roman

+0

Roman, daha spesifik olabilir, belki de bir link olabilir - bulduğum bir yerde bir uygulama vardı… (Eminim) –

İlgili konular