[Lazarus] Multithreaded app with PostgreSQL connection

Mark Morgan Lloyd markMLl.lazarus at telemetry.co.uk
Mon Jun 20 20:26:03 CEST 2016


Michael Van Canneyt wrote:
> On Mon, 20 Jun 2016, Ondrej Pokorny wrote:
>> Hello!>> I have a multithreaded application where every thread needs 
>> to connect > to the same PostgreSQL database. How to design the DB 
>> connectivity for a > multithreaded application correctly?
> Best is to have every thread use it's own connection.
> If you want only a single connection, then you should make sure all 
> Databaseand Transaction properties (plus setting them to Nil) are 
> protected by acritical section: there are non-threadsafe lists involved.
>>> I see that TPQConnection has an FConnectionPool. So is it thread-safe?
> Not if you don't follow the above steps.
>>> Create a TPQConnection in the main thread; create > 
>>> TSQLQuery+TSQLTransaction in a (different) thread and connect it to 
>>> to > the TPQConnection from main thread via the Database property?> 
>>> Or do I need a TPQConnection per thread?
> Yes.
>>> I somehow failed to find any information about sqldb and 
>>> multithreading:> 
>>> http://www.freepascal.org/docs-html/fcl/sqldb/index.html> 
>>> http://wiki.freepascal.org/SQLdb_Programming_Reference
> Because it is not thread safe. It is on my todo list.

I was going to post a pointer to previous discussion at 
http://comments.gmane.org/gmane.comp.ide.lazarus.general/46205 but I 
think Michael's comment here overrides anything that's been said 
previously :-)

Irrespective of whether the underlying components are thread-safe, I 
think it's advisable to protect them from reentry with a critical 
section. There's just too much to go wrong in libpq etc., and in 
particular there's a risk of mayhem if somebody migrates an app to a 
database less-tolerant.

-- 
Mark Morgan Lloyd
markMLl .AT. telemetry.co .DOT. uk

[Opinions above are the author's, not those of his employers or colleagues]



More information about the Lazarus mailing list