diff options
Diffstat (limited to 'lib/sqlalchemy')
| -rw-r--r-- | lib/sqlalchemy/engine/base.py | 2 | ||||
| -rw-r--r-- | lib/sqlalchemy/engine/default.py | 5 | ||||
| -rw-r--r-- | lib/sqlalchemy/pool.py | 35 |
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) |
