Abbiamo sperimentato la gestione della disconnessione di sqlalchemy e come si integra con ORM. Abbiamo studiato i documenti e il consiglio sembra essere quello di intercettare l'eccezione di disconnessione, emettere un rollback()
e riprovare il codice.Un migliore approccio alla gestione di sqlalchemy disconnette
esempio:
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
Seguo la logica - è necessario ritirare ogni transazioni attive e riprodurre loro per garantire un ordinamento coerente delle vostre azioni.
MA - questo significa un sacco di codice aggiuntivo aggiunto a ogni funzione che desidera lavorare con i dati. Inoltre, nel caso di SELECT
, non stiamo modificando i dati e il concetto di rollback/ri-richiesta non è solo antiestetico, ma una violazione del principio di DRY (non ripeterti).
Mi chiedevo se agli altri sarebbe dispiaciuto condividere come gestiscono le disconnessioni con sqlalchemy.
FYI: stiamo usando sqlalchemy 0.9.8 e 9.2.9 Postgres
Attualmente stiamo usando [Pessimistic Disconnect Handling] (http://docs.sqlalchemy.org/en/latest/core/pooling.pooling.php?disconnect-handling-pessimistic) con * un po '* di successo per mitigare 'MySQL ha andato via '. Stiamo ancora assistendo a un caso in produzione, anche se non riusciamo a recuperare da quella situazione e la transazione non può essere ripristinata e si blocca. Anche se questo potrebbe avere qualcosa a che fare con il fatto che stiamo unendo due transazioni (ZODB e SQL) e non stiamo usando [commit a due fasi] (http://docs.sqlalchemy.org/en/latest/orm/ session_transaction.html # enable-two-phase-commit) ancora. –
Con PostgreSQL, semplicemente non abbiamo ancora avuto alcun problema di disconnessione, quindi nessuna esperienza lì. –
Quindi, hai deciso di accettare la logica try/catch/retry? Abbiamo decine di funzioni di query nella nostra classe ORM e gestiamo diverse classi di dozzine. Questo davvero aggiunge. A proposito, non abbiamo avuto alcun problema con Postgres che ha riavviato fino a poco tempo fa quando l'assassino di RHEL ha ucciso un postmaster di vecchia data. Improvvisamente ci siamo resi conto che dobbiamo riprenderci da questo con grazia. – user590028