Commits

Mike Bayer  committed ee5fe8e

- [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]

  • Participants
  • Parent commits 44d4aba

Comments (0)

Files changed (3)

     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

File lib/sqlalchemy/engine/base.py

 
 
             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)

File test/engine/test_reconnect.py

 
         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