piro pool.py patch.

This commit is contained in:
Federico Di Gregorio 2005-09-24 13:59:57 +00:00
parent feeea0309a
commit b7e5e5e272
2 changed files with 24 additions and 18 deletions

View File

@ -1,9 +1,15 @@
2005-09-23 Federico Di Gregorio <fog@debian.org>
* lib/pool.py: applied patch from piro to avoid the scan of the
whole connection array on getconn().
2005-09-12 Federico Di Gregorio <fog@initd.org> 2005-09-12 Federico Di Gregorio <fog@initd.org>
* lib/pool.py: Applied psycopg->psycopg2 patch to from bug #35. * lib/pool.py: Applied psycopg->psycopg2 patch to from bug #35.
* ZpsycopgDA/db.py: fixed problem with OperationalError that resulted in * ZpsycopgDA/db.py: fixed problem with OperationalError that
cryptic message to Zope users ("'OperationalError' is not defined".) resulted in cryptic message to Zope users ("'OperationalError' is
not defined".)
2005-08-23 Federico Di Gregorio <fog@debian.org> 2005-08-23 Federico Di Gregorio <fog@debian.org>

View File

@ -53,6 +53,7 @@ class AbstractConnectionPool(object):
self._pool = [] self._pool = []
self._used = {} self._used = {}
self._rused = {} # id(conn) -> key map
self._keys = 0 self._keys = 0
for i in range(self.minconn): for i in range(self.minconn):
@ -63,6 +64,7 @@ class AbstractConnectionPool(object):
conn = psycopg2.connect(*self._args, **self._kwargs) conn = psycopg2.connect(*self._args, **self._kwargs)
if key is not None: if key is not None:
self._used[key] = conn self._used[key] = conn
self._rused[id(conn)] = key
else: else:
self._pool.append(conn) self._pool.append(conn)
return conn return conn
@ -72,30 +74,27 @@ class AbstractConnectionPool(object):
self._keys += 1 self._keys += 1
return self._keys return self._keys
def _findkey(self, conn):
"""Return the key associated with a connection or None."""
for o, k in self._used.items():
if o == conn:
return k
def _getconn(self, key=None): def _getconn(self, key=None):
"""Get a free connection and assign it to 'key' if not None.""" """Get a free connection and assign it to 'key' if not None."""
if self.closed: raise PoolError("connection pool is closed") if self.closed: raise PoolError("connection pool is closed")
if key is None: key = self._getkey() if key is None: key = self._getkey()
if not self._used.has_key(key): if self._used.has_key(key):
if not self._pool: return self._used[key]
if self._pool:
self._used[key] = conn = self._pool.pop()
self._rused[id(conn)] = key
return conn
else:
if len(self._used) == self.maxconn: if len(self._used) == self.maxconn:
raise PoolError("connection pool exausted") raise PoolError("connection pool exausted")
return self._connect(key) return self._connect(key)
else:
self._used[key] = self._pool.pop()
return self._used[key]
def _putconn(self, conn, key=None, close=False): def _putconn(self, conn, key=None, close=False):
"""Put away a connection.""" """Put away a connection."""
if self.closed: raise PoolError("connection pool is closed") if self.closed: raise PoolError("connection pool is closed")
if key is None: key = self._findkey(conn) if key is None: key = self._rused[id(conn)]
if not key: if not key:
raise PoolError("trying to put unkeyed connection") raise PoolError("trying to put unkeyed connection")
@ -109,6 +108,7 @@ class AbstractConnectionPool(object):
# thread tries to put back a connection after a call to close # thread tries to put back a connection after a call to close
if not self.closed or key in self._used: if not self.closed or key in self._used:
del self._used[key] del self._used[key]
del self._rused[id(conn)]
def _closeall(self): def _closeall(self):
"""Close all connections. """Close all connections.