Thread: Using libpq in a multithreaded environment

Using libpq in a multithreaded environment

From
Rini Dutta
Date:
Hi,
I need to use libpq in a multithreaded environment.
Ideally I would like to open a single connection to
the database and use that for all threads. 
I just discovered that the PGconn returned when a
connection is opened is usable for only one thread
since it also seems to store the result (PGresult *)
and the errorMessage. Could you tell me if there is a
way to use one connection in multiple threads, or
whether I will need to necessarily open one Connection
per thread ? Which is the preferred course of action ?


Thanks,
Rini

ps : Sorry, but I've been  unable to search the
archives before sending this mail. For the last three
days each time I try a search I get the folllowing
message :

The document contained no data. Try again later or
contact the server's administrator.
__________________________________________________
Do You Yahoo!?
Talk to your friends online with Yahoo! Messenger.
http://im.yahoo.com


Re: [HACKERS] Using libpq in a multithreaded environment

From
Tom Lane
Date:
Rini Dutta <rinid@rocketmail.com> writes:
> I need to use libpq in a multithreaded environment.
> Ideally I would like to open a single connection to
> the database and use that for all threads. 

Not unless you provide some interlock that will prevent multiple threads
from issuing queries at the same time...

> I just discovered that the PGconn returned when a
> connection is opened is usable for only one thread
> since it also seems to store the result (PGresult *)
> and the errorMessage.

This is the least of your worries --- the backend is not multithreaded
either, so it will not accept concurrent queries; nor is the frontend-
to-backend protocol capable of keeping track of concurrent queries.

Unless your intended use of the connection is considerably more
restricted than you have indicated, you will want one connection
per query-issuing thread.

This would not prevent you from handing off completed PGresults to
other threads for processing; but operations on a PGconn should be
either restricted to one thread or protected by a mutex.
        regards, tom lane