Nach http://docs.sqlalchemy.org/en/rel_0_9/core/pooling.html#disconnect-handling-pessimistic kann SQLAlchemy instrumentiert werden wieder zu verbinden, wenn ein Eintrag im Verbindungspool nicht mehr gültig ist. Ich erstellen Sie den folgenden Testfall dies zu testen:Wie kann SQLAlchemy gelernt werden, sich von einer Unterbrechung zu erholen?
import subprocess
from sqlalchemy import create_engine, event
from sqlalchemy import exc
from sqlalchemy.pool import Pool
@event.listens_for(Pool, "checkout")
def ping_connection(dbapi_connection, connection_record, connection_proxy):
cursor = dbapi_connection.cursor()
try:
print "pinging server"
cursor.execute("SELECT 1")
except:
print "raising disconnect error"
raise exc.DisconnectionError()
cursor.close()
engine = create_engine('postgresql://[email protected]/test')
connection = engine.connect()
subprocess.check_call(['psql', str(engine.url), '-c',
"select pg_terminate_backend(pid) from pg_stat_activity " +
"where pid <> pg_backend_pid() " +
"and datname='%s';" % engine.url.database],
stdout=subprocess.PIPE)
result = connection.execute("select 'OK'")
for row in result:
print "Success!", " ".join(row)
Aber statt erholt Ich erhalte diese Ausnahme:
sqlalchemy.exc.OperationalError: (OperationalError) terminating connection due to administrator command
server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
Da „Pingen Server“ auf dem Terminal ausgedruckt wird es sicher scheint zu dem Schluss, dass die Ereignis-Listener ist angehängt. Wie kann SQLAlchemy lernen, sich von einer Unterbrechung zu erholen?
Sie scheinen zu bestätigen, dass die SQLAlchemy Dokumentation irreführend ist. Der _Pool_ in diesem Kontext ohne Wert, wenn jede Abfrage in eine Hilfsmethode eingebunden werden muss, führt die Ausnahmebehandlung und die explizite Wiederherstellung durch. – eradman