diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2007-04-17 00:21:25 +0000 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2007-04-17 00:21:25 +0000 |
| commit | b81a0132a84a54559b7dbce075988dec62ed7da7 (patch) | |
| tree | e967111fa6de4c2c9b43338fb13c5bc06a5b23aa /lib/sqlalchemy | |
| parent | 86fef1e4593a6c25e83b2aca7577c62bec9fa2a9 (diff) | |
| download | sqlalchemy-b81a0132a84a54559b7dbce075988dec62ed7da7.tar.gz | |
added "recreate()" argument to connection pool classes
this method is called when the invalidate() occurs for a disconnect condition,
so that the entire pool is recreated, thereby avoiding repeat errors on
remaining connections in the pool.
dispose() called as well (also fixed up) but cant guarantee all connections closed.
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) |
