Iain Mackay
imm at iain-mackay.org
Thu Jul 8 01:49:59 EDT 2004
Dear Nicolas Thank you for those most helpful comments. As a first step I rewrote my specimen code using a Lock on a global database connection: This is very much faster than the server locks, and at least with a modest load seems to have no concurrency problems either. import threading users = None apache.log_error ("userHandler initialising", apache.APLOG_INFO) DBLock = threading.Lock() def beginDB (req): global DBLock DBLock.acquire() global users if not users: try: try: defaultUser = req.get_options ()["defaultUser"] except: defaultUser = "guest" users = userdatabase.UserDatabase\ (sqlite.connect (req.get_options ()["dbFile"], 077, autocommit=1), defaultUser) except: (type, value, tb) = sys.exc_info() apache.log_error ("Cannot access user database: %s (%s)" % (type, value), apache.APLOG_ERR) def endDB (req): DBLock.release() This is still sharing a single database connection. The issue of how much benefit you can get from multiple connections is a complex one; in the case of SQLite I suspect it is quite limited, because SQLite locks the entire database for each transaction. In a production situation one might well us a different database. If we move to a connection-per-thread paradigm, the code becomes slightly more complex than I like to attempt in the wee small hours, so I'll leave that for later. I suppose the main drift here is that on Windows one has to beware threading issues in mod_python; but t(h)read carefully and all will be well. Iain
|