From e597d3d14527eb163c6fd78e5e135525fc14c3c8 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Fri, 22 Jun 2012 12:42:01 -0400 Subject: [PATCH] - [bug] Fixed bug whereby if a database restart affected multiple connections, each connection would individually invoke a new disposal of the pool, even though only one disposal is needed. [ticket:2522] --- CHANGES | 6 ++++++ lib/sqlalchemy/engine/base.py | 5 ++++- test/engine/test_reconnect.py | 27 +++++++++++++++++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 9721775f7b..bed5bd1fa7 100644 --- a/CHANGES +++ b/CHANGES @@ -157,6 +157,12 @@ underneath "0.7.xx". the new pool. This fix may or may not be ported to 0.7. [ticket:2522] + - [bug] Fixed bug whereby if a database restart + affected multiple connections, each + connection would individually invoke a new + disposal of the pool, even though only + one disposal is needed. [ticket:2522] + - [feature] Added a new system for registration of new dialects in-process without using an entrypoint. See the diff --git a/lib/sqlalchemy/engine/base.py b/lib/sqlalchemy/engine/base.py index 75f6ac29a6..2972752232 100644 --- a/lib/sqlalchemy/engine/base.py +++ b/lib/sqlalchemy/engine/base.py @@ -1833,8 +1833,11 @@ class Connection(Connectable): if is_disconnect: + dbapi_conn_wrapper = self.connection self.invalidate(e) - self.engine.dispose() + if not hasattr(dbapi_conn_wrapper, '_pool') or \ + dbapi_conn_wrapper._pool is self.engine.pool: + self.engine.dispose() else: if cursor: self._safe_close_cursor(cursor) diff --git a/test/engine/test_reconnect.py b/test/engine/test_reconnect.py index b545aca523..da9e542925 100644 --- a/test/engine/test_reconnect.py +++ b/test/engine/test_reconnect.py @@ -264,6 +264,33 @@ class RealReconnectTest(fixtures.TestBase): conn.close() + def test_multiple_invalidate(self): + c1 = engine.connect() + c2 = engine.connect() + + eq_(c1.execute(select([1])).scalar(), 1) + + p1 = engine.pool + engine.test_shutdown() + + try: + c1.execute(select([1])) + assert False + except tsa.exc.DBAPIError, e: + assert e.connection_invalidated + + p2 = engine.pool + + try: + c2.execute(select([1])) + assert False + except tsa.exc.DBAPIError, e: + assert e.connection_invalidated + + # pool isn't replaced + assert engine.pool is p2 + + def test_ensure_is_disconnect_gets_connection(self): def is_disconnect(e, conn, cursor): # connection is still present -- 2.47.3