]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
merged fix that insures unrealized connections dont fill up the pool
authorMike Bayer <mike_mp@zzzcomputing.com>
Tue, 31 Jan 2006 05:20:19 +0000 (05:20 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Tue, 31 Jan 2006 05:20:19 +0000 (05:20 +0000)
lib/sqlalchemy/pool.py

index e62ac709a434e252fa9d535ad8d3c960288c4505..fe5c29e88eb4487873c55265834214c76bbde71c 100644 (file)
@@ -95,13 +95,22 @@ class Pool(object):
             self.log("get connection from pool")
             self.log(self.status())
         return self.do_get()
-        
+    
+    def return_invalid(self):
+        if self._echo:
+            self.log("return invalid connection to pool")
+            self.log(self.status())
+        self.do_return_invalid()
+            
     def do_get(self):
         raise NotImplementedError()
         
     def do_return_conn(self, conn):
         raise NotImplementedError()
-    
+        
+    def do_return_invalid(self):
+        raise NotImplementedError()
+        
     def status(self):
         raise NotImplementedError()
 
@@ -115,6 +124,7 @@ class ConnectionFairy(object):
             self.connection = pool.get()
         except:
             self.connection = None
+            self.pool.return_invalid()
             raise
     def cursor(self):
         return CursorFairy(self, self.connection.cursor())
@@ -147,7 +157,12 @@ class SingletonThreadPool(Pool):
 
     def do_return_conn(self, conn):
         pass
-        
+    def do_return_invalid(self):
+        try:
+            del self._conns[thread.get_ident()]
+        except KeyError:
+            pass
+            
     def do_get(self):
         try:
             return self._conns[thread.get_ident()]
@@ -171,6 +186,12 @@ class QueuePool(Pool):
         except Queue.Full:
             self._overflow -= 1
 
+    def do_return_invalid(self):
+        if self._echo:
+            self.log("return invalid connection")
+        if self._pool.full():
+            self._overflow -= 1
+        
     def do_get(self):
         if self._echo:
             self.log("get connection from pool")