David Creemer wrote:
> FYI, As of SQLite 3.3.1, some of the threading restrictions on  
> database connection sharing have been relaxed. I have not yet tried  
> it with SQLObject, but it looks like threaded connection pooling  
> might now work. See:
> 
> http://www.sqlite.org/cvstrac/wiki?p=MultiThreading
> 

I am using the latest version (pysqlite 2.3.1) which I believe is 
against the latest or near latest sqlite so probably is better than 
3.3.1. But the connection pooling still doesn't work as expected. I 
guess it comes down to what the connection pool does and how it works 
when interfaced with cherrypy.

 From the cherrypy side I think a separate thread is created to handle 
incoming requests (ie the threadPool). Those requests are passed to 
handler objects and calls made to handler methods. Within these methods 
the SQLObjects are accessed.

Thus if there are 10 threads on the cherrypy side then all 10 will have 
the same ConnectionHub instance, but have separate connectionForURI 
instances as shown::

hub = dbconnection.ConnectionHub()
def connect (threadIndex) :
      hub.threadConnection = connectionForURI('sqlite:///c|db/books.db')
      cherrypy.threadData.db = hub
cherrypy.server.onStartThreadList = [connect]

Now my reading of this code is that a hub instance is created and it's 
threadConnection attribute is set to the SQLite connection instance, 
then the the hub instance is stored as thread specific data. This hub 
object's threadConnection is the connection that is retrieved when 
accessing the data within the cherrypy methods. What I don't understand 
here is what the threadConnection attribute is doing. I read this as the 
threadConnection attribute being overwritten each time the connect 
methods is called. But the code does imply that each time connect is 
called a new thread specific connection is created and stored ... does 
the hub handle each 'setting' of threadConnection itself (placing it 
into the pool)?

Is the mistake to have the instantiation of the connectionForURI within 
the connect method? Should the code instead be::

hub = dbconnection.ConnectionHub()
hub.threadConnection = connectionForURI('sqlite:///c|db/books.db')
def connect (threadIndex) :
      cherrypy.threadData.db = hub
cherrypy.server.onStartThreadList = [connect]

The way I read this code then, is that a single connection would be 
shared between all the threads, however I don't think this will stop the 
exception because the access is within the cherrypy thread and not the 
thread used to create the SQLite connection (which is what the error 
complains about : created in thread x, but used in thread y).

For thread unsafe databases, what I think should happen is the 
connection hub should maintain a map of threadConnection (ie the thread 
id when the thread is created) and a single connectionForURI within it's 
own thread (ie thread 11). All database transactions would use thread 11 
and communications between the handler methods would be via the 
connection hub. Can anyone tell me if this is so?

cheers, Alex.

-- 

Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
sqlobject-discuss mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/sqlobject-discuss

Reply via email to