[Lazarus] RE : RE : How to use critical sections to lookup database info inmain thread?
vfclists at gmail.com
Mon Oct 3 17:21:04 CEST 2011
2011/10/3 Ludo Brands <ludo.brands at free.fr>
> The minimum requirement for multithreaded db access is to use a separate
>> db connection for every thread and transaction isolation.
>> I am not sure if the database library code is faulty or looking up the
>> values in a thread is the problem
>> Some database client libraries have problems with multithreading or have
>> threadsafe versions (fe. libmysql.dll is not threadsafe in the standard
>> The database lookup code is in a data module running in the main thread.
>> Do I have to use a critical section in data module containing the threads to
>> the database lookup?
>> No. That is trying to solve the problem in the wrong place.
> If I put a TCP component such as an Indy http component on that data
> module, and get all the lookups to be done over the http socket, is that
> likely to fix the problem, rather than calling the database lookup code in
> the data module directly from the threads?
> You mean you have a 2nd path to your database over http? As long as you
> don't use the same database connection (session) from the different threads
> and are sure there are no transaction isolation issues you can use whatever
> communication protocol you like. Seems complicating things though.
> Why don't you write a data lookup class in your data module that uses it's
> own Txxxconnection,TSQLTransaction and TSqlQuery and have each thread use
> its own instance? Destroy after use or, when frequent data updates are
> needed, give it a DisConnect method so that the number of sessions remains
> reasonable. If you have a lot of threads and the number of simultanuous
> database sessions is an issue, then write one lookup procedure using a
> criticial section but, again, using its own database connection: enter
> criticial section, connect to database, run sql, retrieve data, disconnect,
> exit critical section.
I am now using a separate TConnection for the threaded code and now all the
values are found if the database lookup code executes, but it seems that the
database lookup is not called all the time, and this may be due to some of
the threads not executing properly.
I will make some more tests to see where the other problems might be
> Lazarus mailing list
> Lazarus at lists.lazarus.freepascal.org
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the Lazarus