On 04/28/2006 08:35 AM, *binarystar* wrote:
Looking better at the """ Humble Database Connection Class """: if I am
not mistaken, it seems to mix up connections and cursors.
MySQLdb has a thread safety level of '1', meaning: "Threads may share
the module, but not connections". So you have to give each thread an own
connection. Beside of that I would prefer not to share the cursor
object, although it should not really matter.
The following should work and make the cursors private to the Execute
function (untested):
class DB_Connector(object):
""" Humble Database Connection Class """
def __init__(self, host="localhost",
user="MyUser",
passwd="MyPassword",
**other_db_arguments):
self.host = host
self.user = user
self.passwd = passwd
# Unpack Other Database Arguments Here
self.CreateConnection()
def CreateConnection(self):
self.connection = MySQLdb.connect(self.host,
self.user,
self.passwd)
def DestroyConnection(self):
self.connection.close()
def Execute(self, sql_statement):
cursor = self.connection.cursor()
cursor.execute(sql_statement)
result = cursor.fetchall()
cursor.close()
return result
> I suppose that is possible because you are calling the one instance of a
> cursor object ... maybe you have to create a copy of the cursor object,
> rather than passing a reference to the one object? or set up the
> db_connection objects inside each of the threads? ..
>
> Winfried Tilanus wrote:
>> On 04/28/2006 07:54 AM, *binarystar* wrote:
>>
>> Just wondering: is there any risk of two threads accessing the Execute
>> function at the same time and getting something like this on the same
>> cursor object:
>>
>> thread_1: self.cursor.Execute( sql_statement )
>> thread_2: self.cursor.Execute( sql_statement )
>> thread_1: return self.cursor.FetchAll()
>> thread_2: return self.cursor.FetchAll()
>>
>> In that case the queries would seriously be messed up. My intuition says
>> this would need some locking or a 'cursor-pool'.
>>
>> best wishes,
>>
>> Winfried
>>
>>
>>> your on the right track ... create something like this ( hope the
>>> formatting doesn't go to hay wire )
>>>
>>> class DB_Connector(object):
>>>
>>> """ Humble Database Connection Class """
>>> def __init__(self, host="localhost",
>>> user="MyUser",passwd="MyPassword", **other_db_arguments):
>>> self.host = host
>>>self.user = user
>>>self.passwd = passwd
>>> # Unpack Other Database Arguments Here
>>> self.CreateConnection()
>>>def CreateConnection( self ):
>>> self.cursor = MySQLdb.connect(self.host, self.user,
>>> self.passwd)
>>>def DestroyConnection( self ):
>>> self.cursor.close()
>>>def Execute( self, sql_statement ):
>>> self.cursor.Execute( sql_statement )
>>> return self.cursor.FetchAll()
>>>Then when you run your program create an instance of the object
>>>
>>> db_connection = DB_Connector( 'localhost', 'administrator',
>>> 'betelgeuse99', auto_commit=1, other_keyword_arg="yes" )
>>>
>>> now when you pass the db_connection instance to other classes, a copy
>>> will be made automagically
>>>
>>> thread_1_instance= ThreadingClass( db_connection )
>>> thread_2_instance= ThreadingClass( db_connection )
>>> thread_3_instance= ThreadingClass( db_connection )
>>>
>>> should work ..
>>> I hope this is useful
--
http://mail.python.org/mailman/listinfo/python-list