|
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
|