Biz sqlalchemy bağlantı kesmek işleme ve bunun ORM ile nasıl entegre olduğunu deneyler. Biz dokümanlar inceledim ve tavsiye, bağlantı kesme istisnayı yakalamak bir rollback()
sorunu ve kod yeniden denemek için gibi görünüyor.sqlalchemy işlemek için daha iyi bir yaklaşım keser
örn:
import sqlalchemy as SA
retry = 2
while retry:
retry -= 1
try:
for name in session.query(Names):
print name
break
except SA.exc.DBAPIError as exc:
if retry and exc.connection_invalidated:
session.rollback()
else:
raise
Ben gerekçesini izleyin - Herhangi etkin işlemler geri alma ve eylemlerin tutarlı sıralamasını sağlamak için onları tekrar zorundayız.
AMA - bu, veriyle çalışmak isteyen her işleve fazladan bir kod ekleneceği anlamına gelir. Ayrıca, SELECT
söz konusu olduğunda, verileri değiştirmiyoruz ve geri alma/yeniden istek kavramı sadece çirkin değil, aynı zamanda DRY ilkesini ihlal ediyor (kendinizi tekrar etmeyin).
Başkalarının şüphe uyandırıcılarla bağlantı kesimlerini nasıl ele aldıklarını paylaştığını düşünürler mi diye merak ediyordum.
Bilginize: SQLAlchemy 0.9.8 ve Postgres 9.2.9
Şu anda [Kötümser Bağlantı Kesme İşlemi] (http://docs.sqlalchemy.org/en/latest/core/pooling.html#disconnect-handling-pessimistic) kullanarak * bazı * başarıyı azaltmak için MySQL var gitti. Yine de bu durumdan kurtulamayacağımız bir yerde üretimde bir dava görüyoruz ve işlem geri alınamaz ve takılıp kalmaz. Her ne kadar bu iki işleme (ZODB ve SQL) katılacağımız ve [İki Aşamalı işler] (http://docs.sqlalchemy.org/en/latest/orm/ session_transaction.html # enable-two-phase-commit) henüz. –
PostgreSQL ile, henüz herhangi bir bağlantı kesme işlemi gerçekleştiremedik. –
Yani - try/catch/retry mantığını kabul etmeye karar verdiniz mi? ORM sınıfımızda onlarca sorgu fonksiyonumuz var ve birkaç düzinelerce sınıfı yönetiyoruz. Bu gerçekten ekliyor. BTW - biz Postgres RHEL oom katili uzun süren bir postmaster öldürdü geçenlerde ne zamana kadar yeniden başlatmayı ile herhangi bir sorun olmamıştı. Aniden, bu zarafetten kurtulmamız gerektiğini farkettik. – user590028