2013-08-17 8 views
5

İlk olarak, Puma (ancak MRI ile) Rails 3.2 kullanıyorum ve elle açık bir iş parçacığı yapıyorum.ActiveRecord SQL bağlantısını yürütmek için gerekli yürütmeyi yürütüyor mu? DEPRECATION UYARI: Veritabanı bağlantıları otomatik olarak kapatılmayacaktır

MyModel.connection.execute gibi execute yöntemini kullanarak yerlerdeyim veya ActiveRecord::Base.connection.execute aynı şeyi yapabilirim çünkü tüm bağlantılar şu anda benim için aynı DB'ye sahipler. Çoğunlukla Sinatra (ex ActiveRecord connection warning. (Database connections will not be closed automatically)) ile ActiveRecord kullanma hakkında

Geçenlerde

DEPRECATION WARNING: Database connections will not be closed automatically, please close your database connection at the end of the thread by calling `close` on your connection. For example ActiveRecord::Base.connection.close 

Bu kendini açıklayıcı görünüyor görmeye başladım, ama çevrimiçi üzerine çok az bilgi bulabilirsiniz.

Okuduğum bu:

Raf katman sürece DB (eğer doğru anlamak) işlem bir denetleyici yapılır yürütmek olarak benim için yapar düşündürmektedir

http://blog.daniel-azuma.com/archives/216

. Bu, başka bir yerde yapılan işlemler (bir model veya dekoratör gibi - birçok yerde yararlıdır, bu yüzden onları tek bir denetleyiciye koymak istemiyorum) açık bir şekilde kapatılmalı mıdır? Bir kontrolör, eski karşı yapıyor bir modeli yöntemi denilen o kanalın hangi bile:

class MyController 
    def show 
    MyModel.do_execute_sql_stuff 
    end 
end 

class MyModel 
    def self.do_execute_sql_stuff 
    connection.execute("WHATEVER;") 
    end 
end 

Do Burada açıkça yakın gerekir? Eğer öyleyse, makalenin önerdiği gibi MyModel.connection.close veya MyModel.clear_active_connections! kullanmalı mıyım? Belki de İngilizce benim ilk dilim değil, ama bu yöntem tehlikeli geliyor! Ve ben nasıl yaparım?

conn = MyModel.connection 
result = conn.execute("STUFF") 
do_stuff_with(result) 
conn.close |or| MyModel.clear_active_connections! 

Böyle mi?

find_by_sql kullanırken ne yapılmalıdır? Bağlantı havuza geri dönecek mi yoksa açıkça bunu yapmak zorunda mıyım?

DÜZENLEME: Tuhaf bir şekilde, sadece bunu üretim günlüklerimde görüyorum. Gelişimde değil, aşamada (üretim ile aynı olmalıdır).

cevap

7

Bu durumda bağlantınızı manuel olarak kapatmanız gerekir.

Komut dosyanızı çalıştırdıktan sonra, bunu manuel olarak kapatabilirsiniz.

after do 
    ActiveRecord::Base.connection.close 
end 
+1

Bu durumda? Modelden ne zaman yapılır? Dekoratör? Yardımcı? Bu bir kapalı komut dosyası değil, ancak, bu sürekli olarak çalışıyor ... –

+0

Modelde bir yöntem yapabilir ve bağlantıyı kapatmak istediğiniz yerde yürütme kodunuzun sonunda çağırabilirsiniz. Bu yöntem kodun üzerinde olduğundan, çağrıldığında bağlantı kesilebilir. – Mehul

+1

Sorduğum şey, _when_ bunu yapmak zorunda mıyım - modelden sorgularken? Bir dekoratörden mi? Bir yardımcıdan mı? "Yürütme kodunun sonunda çağır" deyin - hangi yürütme kodu bu? –

İlgili konular