2011-11-20 36 views
10

Ben PostgreSQL 9.1/PostGIS 1.5, psycopg2 2.4.2 ve pgBouncer 1.4.2 ile Django 1.3 çalıştırıyorum üzerinde kirli sunucuyu.pgBouncer - çünkü kapanış: Her bağlantının

2011-11-20 02: 15: 25,027 29538 LOG S-0x96c2200: Ben pgbouncer.log bir günlük girişi olsun veritabanına her bağlantıda

app_db/[email protected] : 5432 kapanıyor çünkü: kirli sunucu (yaş = 0).

Bu soruna herhangi bir çözüm bulamıyorum - herhangi birinin neden olduğu hakkında bir fikriniz var mı? Ben pgbouncer (oturum/işlem modu, farklı zaman aşımları vb) yeniden yapılandırmayı denedim, ama boşuna. Tamam

cevap

15

, bunu çözdüm. Sorun Django ve Psycopg2 ile uzun zamandır devam eden bir sorun yatıyor. Temel olarak, Psycopg2 otomatik olarak DB'ye bir BEGIN bildirisi yayınlayacaktır. Ancak, Django hiçbir veri değişikliği yapılmadığını düşünürse, bir işlemin sonunda bir COMMIT yayınlamaz.

Orada, bu soruna bir kaç çözümleridir fazla ayrıntı için http://www.slideshare.net/OReillyOSCON/unbreaking-your-django-application bak. İdeal olarak otomatik taahhütleri kapatırsınız (autocommit = DB ayarlarınızda True, uygunsuz adlandırma kuralı ayarlanarak). Bu, salt okunur işlevlerdeki işlemleri ve yazma işlevlerini engeller; bu nedenle, bu işlevleri bir @commit_on_success dekoratöründe elle sarmanız gerekir.

Alternatif sadece Katman sınıflarına django.middleware.transaction.TransactionMiddleware ekleyin. Bu işlemdeki her isteği saracak. Bu, bir işlemde salt okunur istekleri de gereksiz yere sarmak anlamına gelir, ancak hızlı ve kirli bir çözümdür.

+0

Tamam sadece zor yoldan öğrendim, UYARI: Arka plan görevi işleme kereviz (veya başka bir şey) kullanıyorsanız sadece bunu yapmayın. Bir nesnenin birincil anahtarını, uyumsuz çalışan bir göreve geçireceğiniz yarış koşulları olabilir. Görev, istek bitmeden (ve işlemin gerçekleştirilmesinden) önce çalışmaya başlayabilir, böylece görev nesneyi bulamaz. Bunun tek çözümünün manuel işlem yönetimi olduğunu düşünüyorum. – Dick

+1

Sunumuma link verdiğim için teşekkür notu ... Yararlı olduğuna sevindim! :) – Christophe

+0

Tabii ki! Harika bir sunumdu; Django'daki 'kırılmış' işlem yönetimi hakkında çok az şey bilindiğini çarpıcı buluyorum. – Dick

İlgili konular