summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sqlalchemy')
-rw-r--r--lib/sqlalchemy/engine/base.py2
-rw-r--r--lib/sqlalchemy/engine/default.py5
-rw-r--r--lib/sqlalchemy/pool.py35
3 files changed, 34 insertions, 8 deletions
diff --git a/lib/sqlalchemy/engine/base.py b/lib/sqlalchemy/engine/base.py
index 6f0ff029a..e7a3f8feb 100644
--- a/lib/sqlalchemy/engine/base.py
+++ b/lib/sqlalchemy/engine/base.py
@@ -577,6 +577,7 @@ class Connection(Connectable):
except Exception, e:
if self.dialect.is_disconnect(e):
self.__connection.invalidate(e=e)
+ self.engine.connection_provider.dispose()
self._autorollback()
if self.__close_with_result:
self.close()
@@ -588,6 +589,7 @@ class Connection(Connectable):
except Exception, e:
if self.dialect.is_disconnect(e):
self.__connection.invalidate(e=e)
+ self.engine.connection_provider.dispose()
self._autorollback()
if self.__close_with_result:
self.close()
diff --git a/lib/sqlalchemy/engine/default.py b/lib/sqlalchemy/engine/default.py
index 969bde8d9..f1858acdc 100644
--- a/lib/sqlalchemy/engine/default.py
+++ b/lib/sqlalchemy/engine/default.py
@@ -20,9 +20,8 @@ class PoolConnectionProvider(base.ConnectionProvider):
def dispose(self):
self._pool.dispose()
- if hasattr(self, '_dbproxy'):
- self._dbproxy.dispose()
-
+ self._pool = self._pool.recreate()
+
class DefaultDialect(base.Dialect):
"""Default implementation of Dialect"""
diff --git a/lib/sqlalchemy/pool.py b/lib/sqlalchemy/pool.py
index a617f8fec..9a2cdad0e 100644
--- a/lib/sqlalchemy/pool.py
+++ b/lib/sqlalchemy/pool.py
@@ -142,7 +142,20 @@ class Pool(object):
def create_connection(self):
return _ConnectionRecord(self)
+
+ def recreate(self):
+ """return a new instance of this Pool's class with identical creation arguments."""
+ raise NotImplementedError()
+ def dispose(self):
+ """dispose of this pool.
+
+ this method leaves the possibility of checked-out connections remaining opened,
+ so it is advised to not reuse the pool once dispose() is called, and to instead
+ use a new pool constructed by the recreate() method.
+ """
+ raise NotImplementedError()
+
def connect(self):
if not self._use_threadlocal:
return _ConnectionFairy(self).checkout()
@@ -172,17 +185,15 @@ class Pool(object):
def log(self, msg):
self.logger.info(msg)
- def dispose(self):
- raise NotImplementedError()
-
class _ConnectionRecord(object):
def __init__(self, pool):
self.__pool = pool
self.connection = self.__connect()
def close(self):
- self.__pool.log("Closing connection %s" % repr(self.connection))
- self.connection.close()
+ if self.connection is not None:
+ self.__pool.log("Closing connection %s" % repr(self.connection))
+ self.connection.close()
def invalidate(self, e=None):
if e is not None:
@@ -348,7 +359,17 @@ class SingletonThreadPool(Pool):
self._conns = {}
self.size = pool_size
+ def recreate(self):
+ self.log("Pool recreating")
+ return SingletonThreadPool(self._creator, pool_size=self.size, recycle=self._recycle, echo=self.echo, use_threadlocal=self._use_threadlocal, auto_close_cursors=self.auto_close_cursors, disallow_open_cursors=self.disallow_open_cursors)
+
def dispose(self):
+ """dispose of this pool.
+
+ this method leaves the possibility of checked-out connections remaining opened,
+ so it is advised to not reuse the pool once dispose() is called, and to instead
+ use a new pool constructed by the recreate() method.
+ """
for key, conn in self._conns.items():
try:
conn.close()
@@ -426,6 +447,10 @@ class QueuePool(Pool):
self._max_overflow = max_overflow
self._timeout = timeout
+ def recreate(self):
+ self.log("Pool recreating")
+ return QueuePool(self._creator, pool_size=self._pool.maxsize, max_overflow=self._max_overflow, timeout=self._timeout, recycle=self._recycle, echo=self.echo, use_threadlocal=self._use_threadlocal, auto_close_cursors=self.auto_close_cursors, disallow_open_cursors=self.disallow_open_cursors)
+
def do_return_conn(self, conn):
try:
self._pool.put(conn, False)