DBPool

DBPool.py

Implements a pool of cached connections to a database for any DB-API 2 compliant database module. This should result in a speedup for persistent applications like Webware. The pool of connections is threadsafe regardless of whether the used DB-API 2 general has a threadsafety of 1 or 2.

For more information on the DB-API 2 specification, see PEP 249.

The idea behind DBPool is that it’s completely seamless, so once you have established your connection, use it just as you would any other DB-API 2 compliant module. For example:

import pgdb  # import used DB-API 2 module
from MiscUtils.DBPool import DBPool
dbpool = DBPool(pgdb, 5, host=..., database=..., user=..., ...)
db = dbpool.connection()

Now use “db” exactly as if it were a pgdb connection. It’s really just a proxy class.

db.close() will return the connection to the pool, not actually close it. This is so your existing code works nicely.

DBPool is actually intended to be a demonstration of concept not to be used in a productive environment. It is really a very simple solution with several drawbacks. For instance, pooled database connections which have become invalid are not automatically recovered. For a more sophisticated solution, please have a look at the DBUtils package.

CREDIT

  • Contributed by Dan Green.

  • Thread safety bug found by Tom Schwaller.

  • Fixes by Geoff Talvola (thread safety in _threadsafe_get_connection()).

  • Clean up by Chuck Esterbrook.

  • Fix unthreadsafe functions which were leaking, Jay Love.

  • Eli Green’s webware-discuss comments were lifted for additional docs.

  • Coding and comment clean-up by Christoph Zwerschke.

class MiscUtils.DBPool.DBPool(dbapi, maxconnections, *args, **kwargs)

Bases: object

__init__(dbapi, maxconnections, *args, **kwargs)

Set up the database connection pool.

dbapi:

the DB-API 2 compliant module you want to use

maxconnections:

the number of connections cached in the pool

args, kwargs:

the parameters that shall be used to establish the database connections using dbapi.connect()

exception MiscUtils.DBPool.DBPoolError

Bases: Exception

General database pooling error.

__init__(*args, **kwargs)
args
with_traceback()

Exception.with_traceback(tb) – set self.__traceback__ to tb and return self.

exception MiscUtils.DBPool.NotSupportedError

Bases: DBPoolError

Missing support from database module error.

__init__(*args, **kwargs)
args
with_traceback()

Exception.with_traceback(tb) – set self.__traceback__ to tb and return self.

class MiscUtils.DBPool.PooledConnection(pool, con)

Bases: object

A wrapper for database connections to help with DBPool.

You don’t normally deal with this class directly, but use DBPool to get new connections.

__init__(pool, con)
close()

Close the pooled connection.