[mod_python] Hi, database connection queston

Danilo Fiorenzano danilo at telusplanet.net
Sun May 28 18:54:02 EST 2000


On Sun, 28 May 2000, Cary O'Brien wrote:
 
> 1) How are people handling persistant database connections?
> [....]
>    It seems from the documentation that each request gets its own
>    subinterpreter.

Since global vars retain their values between requests serviced by the
same httpd process, I ended up doing something like this:

---------------- cut ---------------- cut ---------------- cut ----------------
import informixdb
import os, re, cgi, string
from mod_python import apache

_dbconn = None

def handler(req):
    global _dbconn

    ... etc etc ...
    results = findProducts('acid')
    ... etc etc ...


def findProducts(substring):
    global _dbconn

    if _dbconn == None:
        try:
            _dbconn = informixdb.informixdb('db at server', 'user', 'password')
        except:
            return ['Access Denied']

    c = _dbconn.cursor()
    blah = "%" + string.lower(substring) + "%"

    c.execute("select strshippingname from tblproducts where lower(strshippingname) like ?", (blah,))
    retval = []
    for row in c.fetchall():
        retval.append(row[0])

    return retval

---------------- cut ---------------- cut ---------------- cut ----------------

  This works exactly as you want, although it should also have a "try:
except:" block around the actual query, to recover from dropped
connections et similia.  Otherwise, normally the connection is
established only when a freshly-spawned httpd executes a query for the
first time, and should persist until it reaches 'MaxRequestsPerChild"
in httpd.conf - then the httpd instance is terminated and the
connection is closed automatically.

 I have been wondering how one could automatically preload a Python
module upon start of a new httpd, so users would not have to endure
the occasional delay due to the opening of a new connection to the
database.  I suspect it may be possible by using some apache
directives, but I haven't really looked into it yet :)

-- Shade



More information about the Mod_python mailing list