SORU
20 AĞUSTOS 2009, PERŞEMBE


Django görev değil'hareketleri otomatik olarak ya da db bağlantı t kolu dişli?

Django kendi iş bazı yinelenen görevleri çalıştırmak için hazırladım, ve her zaman bitmemiş bir veritabanı bağlantısı süreçleri geride bırakarak olduklarını fark ettim ("İşlem") Boşta. PostgreSQL

Bu İsim işlemlerin tamamlanmış değildi günlükleri bulunamadı (geri alma) baktım. Çeşitli işlem dekoratörler kullanarak fonksiyonlarımı, hiç şans çalıştım.

Manuel işlem yönetimi geçtim ve el ile geri alma yaptım, işe yaradı, ama hala işler gibi sol"". Boşta

O zaman bağlantı aradım.() kapatın ve her şey yolunda.

Merak ediyorum ama, neden ana Django iş parçacığı kökenli olan bu dişli görevler için Django tipik işlem ve Bağlantı yönetimi çalışmıyor mu?

CEVAP
28 AĞUSTOS 2009, Cuma


Ve Django kaynak kodu test okuma hafta sonra kendi sorumun cevabını buldum:

Hareketleri

Django varsayılan otomatik yürütme davranış hala doğru dişli benim işlevi için de geçerlidir. Ancak, Django docs belirtir:

Veritabanına yazmak için gereken bir eylem gerçekleştirmek için en kısa sürede, Django INSERT/UPDATE/DELETE deyimleri üretir ve TAAHHÜT etmez. Örtülü geri alma yok.

Bu son cümle çok gerçekçi. Django bir şey kirli bayrağı ayarlanmış sürece geri alma komutu YOK. Benim görevim yalnızca SELECT deyimleri yapıyordu beri hiç kirli bayrak ve TAAHHÜT girmemiş.

Bu PostgreSQL hareket Django zaman dilimini AYARLAMAK için bir komut verilmiş çünkü bir geri alma gerektirir düşünmesi aykırı. Gözden Geçirme günlükleri, bu geri alma ifadeleri görüyordum ve Django işlem yönetim kaynağı olduğunu düşünüyordu çünkü kendimi attım. Değil meğer, sorun değil.

Bağlantılar

Bağlantı yönetimi şeyler zor olsun. Django signals.request_finished.connect(close_connection) veritabanı normal olarak kullanır bağlantısını kapatmak için kullandığı ortaya çıktı. Hiç normal bir istek içermeyen Django olur bu yana, verilen bu davranış.

Benim durumumda olsa da, işi zamanlanmış çünkü istek vardı. Hiçbir istek yok sinyal anlamına gelir. Sinyal veritabanı bağlantısı asla kapalı olduğu anlamına geliyor.

Geri dönmeyi hareketleri, bu çıkıyor sadece veren bir çağrı için connection.close() yokluğunda herhangi bir değişiklik için işlem yönetimi sorunlar geri alma deyim PostgreSQL günlük verirdim arıyordum.

Çözüm

Çözüm normal Django işlem yönetimi normal bir şekilde devam edin ve sadece bağlantı üç şekilde kapatmak için izin vermek için

  1. Bağlantıyı kapatan bir dekoratör yazıp gerekli işlevleri sarın.
  2. Mevcut talep kanca Django bağlantıyı kapatmak için sinyal gönderir.
  3. Bağlantıyı el ile işlevi sonunda kapatın.

Bu üç herhangi bir (ve) çalışacak.

Bu deli beni haftalarca sürdü. Bu gelecekte bir başkası yardımcı olur umarım!

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • iNCH

    iNCH

    20 Temmuz 2009
  • MysteryGuitarMan

    MysteryGuita

    16 HAZİRAN 2006
  • New Scientist

    New Scientis

    27 Kasım 2006