diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2008-12-27 18:45:41 +0000 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2008-12-27 18:45:41 +0000 |
| commit | 8220d9cdbe4ae97692a7676e4552572f1baa5131 (patch) | |
| tree | 7c9d2e560f02562fcb3262ea7d6c21f0e3d98e2c /lib/sqlalchemy/pool.py | |
| parent | f80471e6f385739ee23b96dfe4aa3a48fbc8e1fd (diff) | |
| download | sqlalchemy-8220d9cdbe4ae97692a7676e4552572f1baa5131.tar.gz | |
- Added a mutex for the initial pool creation when
using pool.manage(dbapi). This prevents a minor
case of "dogpile" behavior which would otherwise
occur upon a heavy load startup. [ticket:799]
Diffstat (limited to 'lib/sqlalchemy/pool.py')
| -rw-r--r-- | lib/sqlalchemy/pool.py | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/lib/sqlalchemy/pool.py b/lib/sqlalchemy/pool.py index ee4fa0190..1467a4f6b 100644 --- a/lib/sqlalchemy/pool.py +++ b/lib/sqlalchemy/pool.py @@ -865,7 +865,8 @@ class _DBProxy(object): self.params = params self.poolclass = poolclass self.pools = {} - + self._create_pool_mutex = threading.Lock() + def close(self): for key in self.pools.keys(): del self.pools[key] @@ -881,10 +882,17 @@ class _DBProxy(object): try: return self.pools[key] except KeyError: - pool = self.poolclass(lambda: self.module.connect(*args, **params), **self.params) - self.pools[key] = pool - return pool - + self._create_pool_mutex.acquire() + try: + if key not in self.pools: + pool = self.poolclass(lambda: self.module.connect(*args, **params), **self.params) + self.pools[key] = pool + return pool + else: + return self.pools[key] + finally: + self._create_pool_mutex.release() + def connect(self, *args, **params): """Activate a connection to the database. |
