[fpc-pascal] Lifetime of a database (PostgreSQL) connection

Michael Van Canneyt michael at freepascal.org
Sat Jan 1 20:40:44 CET 2011



On Sat, 1 Jan 2011, Mark Morgan Lloyd wrote:

> Michael Van Canneyt wrote:
>> On Fri, 31 Dec 2010, Mark Morgan Lloyd wrote:
>> 
>>> I've just taken our name server down for maintenance, and noted that a 
>>> db-aware app I'd left running ground to a halt despite the fact that it 
>>> was only activating queries, not establishing new (named) connections.
>>> 
>>> The connection was being made by host name rather than by dotted-quad 
>>> address, resulting in a long-term handle associated with the TPQConnection 
>>> object. Whenever a TSQLQuery is activated, it results in the opening of a 
>>> short-term handle, if I'm reading things correctly associated with a 
>>> TSQLTransaction object which relies on the host information from the 
>>> connection object.
>>> 
>>> My expectation is that these short-term handles should not mandate a name 
>>> lookup, since the host name or address cannot be specified at this point. 
>>> Am I being unreasonable?
>> 
>> In order to support multiple transaction, a connection is created for each 
>> transaction. So if you application creates transactions at regular 
>> intervals, then it will perform a name lookup each time a transaction is 
>> created.
>
> The program is not creating explicit transactions and only has read access to 
> the table. I'm establishing a connection during program initialisation and 
> then alternating between two query objects, it's the activation of the query 
> object which is causing a short-term handle to be opened.
>
> Please excuse me for not having looked at the sources yet, but I presume that 
> the client library is performing a name lookup if the initial connection was 
> by name (hopefully it doesn't do this if the connection was by address). I'd 
> suggest that the IP address could usefully be cached in case of name server 
> failure, in the same way that other parameters are cached somewhere (for 
> example, the password in the connection object can be wiped without affecting 
> operation).

The name lookup is not done by FPC itself, but by the Postgresql client library.
This is outside of FPC's control; FPC just asks a connection on a certain IP 
address, it doesn't even know if the adress is an actual IP addres or a DNS name.

You can always do the address lookup yourself, if you want, and pass that to the 
connection component.

Michael.



More information about the fpc-pascal mailing list