diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2012-06-22 12:42:01 -0400 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2012-06-22 12:42:01 -0400 |
| commit | e597d3d14527eb163c6fd78e5e135525fc14c3c8 (patch) | |
| tree | f9c898dedfcf21bef4ed1344c68ceffb73f6ff0b | |
| parent | 5f0a7bb152b30dd7b05771725a7ffe16e3af8f8a (diff) | |
| download | sqlalchemy-e597d3d14527eb163c6fd78e5e135525fc14c3c8.tar.gz | |
- [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]
| -rw-r--r-- | CHANGES | 6 | ||||
| -rw-r--r-- | lib/sqlalchemy/engine/base.py | 5 | ||||
| -rw-r--r-- | test/engine/test_reconnect.py | 27 |
3 files changed, 37 insertions, 1 deletions
@@ -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 75f6ac29a..297275223 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 b545aca52..da9e54292 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 |
