Thread: [SQLObject] webkit, sqlobject, threading, and transactions
SQLObject is a Python ORM.
Brought to you by:
ianbicking,
phd
From: Randall S. <ra...@tn...> - 2005-11-27 06:45:50
|
An application I'm developing will be run on Webware's Webkit and use transactions extensively. Webkit is threaded and I'm not sure how best to setup my database connections for a threaded environment. Say I do this. from sqlobject import * con = connectionForURI(connection_string) sqlhub.threadConnection = con # Define some classes. # Do something in a transaction. sqlhub.threadConnection = con.transaction() # ... sqlhub.threadConnection.commit() # Set connection back. sqlhub.threadConnection = con Correct me if I'm wrong in my assumptions. The webkit threads all reference the same sqlhub, so that when sqlhub is changed to a transaction, they'll try fetch a connection from the transaction object. That's not good. That's how I thought it would work so I did a test. import threading from sqlobject import * from mswater.lib import dblib con = dblib.sqloconnect('pg_ro') sqlhub.threadConnection = con threadnames = range(10) threads = [] class MyThread(threading.Thread): def run(self): print self.getName(), sqlhub.getConnection() for threadname in threadnames: threads.append(MyThread(name=threadname + 1).start()) Suprise to me. The threads were unable to get a connection from sqlhub. Instead I got AttributeError: No connection has been defined for this thread or process So how does a thread get a connection from sqlhub? Assuming a thread could get a connection from sqlhub, I guess I would have to pass transactions into the classes as needed. But that opens up new problems. Say I do this. class ClassA(SQLObject): def _get_classbs(self): ClassB.select(...) class ClassB(SQLObject): trans = sqlhub.threadConnection.transaction() a = ClassA(..., connection=trans) # do some things. classbs = a.classbs I don't think classbs was fetched in the transaction, but instead with another connection. Not good because it doesn't reflect changes made during the transaction. So I can't put the transaction on the sqlhub and I can't pass it into the class. Database connections has been my big sticking point in SQLObject. I'm looking to both understand the mechanics and to learn good practices. When I finally get a grip on it, I should write some documentation. Randall |