[mod_python] Tips and Tricks initiative

vio vmilitaru at sympatico.ca
Tue Jul 9 15:09:59 EST 2002


Admittedly, the intent of re-using a cursor can only be summed up as pure
greed, or the art of sucking up the last atom of speed from a given system.
In dark moonless nights, I almost pitty myself.

Thanks for the intro on threadsafety. Most interesting.

* Bob Ippolito <bob at redivi.com> [020708 22:35]:
> It depends on the particular db module, some modules have threadsafe 
> database instances, some don't.  Some have threadsafe database cursors, 
> and some don't.  Read the docs.  If it's DBAPI compliant, check its 
> thread safe level.  I have never used anything that's thread safe level 
> 3, most are level 2 or 1 in my experience.
> 
> from http://www.python.org/topics/database/DatabaseAPI-2.0.html
> threadsafety
> Integer constant stating the level of thread safety the interface 
> supports. Possible values are:
> 0	= Threads may not share the module.
> 1	= Threads may share the module, but not connections.
> 2	= Threads may share the module and connections.
> 3	= Threads may share the module, connections and cursors.
> 
> Sharing in the above context means that two threads may use a resource 
> without wrapping it using a mutex semaphore to implement resource 
> locking. Note that you cannot always make external resources thread safe 
> bymanaging access using a mutex: the resource may rely on global 
> variables or other external sources that are beyond your control.
> 
> -bob
> 
> On Wednesday, July 3, 2002, at 06:38 PM, vio wrote:
> 
> > * Alain Tesio <alain at onesite.org> [020703 17:11]:
> >
> >>> For instance, I'd be very interested to read in such a tricks and 
> >>> tips list how to avoid the
> >>> overhead of creating a database connection at each call to 'handler'. 
> >>> And so on.
> >>
> >> Just make the connection a global variable.
> >
> > I think I tried that, initialized the db connection at the module 
> > level. But somehow my cursor got corrupted, or something. I forgot 
> > oracle's error number, only that my workaround was to do something like 
> > (we're at module level here):
> >
> > db = DCOracle2.connect(my_login_string)
> > def get_db_cursor():
> >     "create database connection"
> >     cursor = db.cursor() # Allocate a cursor
> >     return cursor
> >
> > In fact I see that I am re-using the same connection here, so let me 
> > re-phrase my initial question: how do I re-use the same *cursor* (or it 
> > this a bad idea in the first place). I wonder what would happen in such 
> > a multi-threaded environment (well, I'm saling in Linuxland) where 
> > multiple httpd instances will hit on the db server (ora8i in my case) 
> > with the same cursor *concurrently* (never got to that point of 
> > desperation, though - but just from contemplating such possibility 
> > sounds like total anarchy). What I did try but eventually got an error 
> > on was to re-use the same cursor sequentially (in a non-threaded 
> > application).
> >
> > Cheers, Vio
> > _______________________________________________
> > Mod_python mailing list
> > Mod_python at modpython.org
> > http://www.modpython.org/mailman/listinfo/mod_python
> 
> _______________________________________________
> Mod_python mailing list
> Mod_python at modpython.org
> http://www.modpython.org/mailman/listinfo/mod_python



More information about the Mod_python mailing list