Psycopg2 pool clarification

israel israel at ravnalaska.net
Tue Jun 6 11:36:09 EDT 2017


Since I've gotten no replies to this, I was wondering if someone could 
at least confirm which behavior (my expected or my observed) is 
*supposed* to be the correct? Should a psycopg2 pool keep connections 
open when returned to the pool (if closed is False), or should it close 
them as long as there is more than minconn open? i.e is my observed 
behavior a bug or a feature?

On 2017-06-02 15:06, Israel Brewster wrote:
> I've been using the psycopg2 pool class for a while now, using code
> similar to the following:
> 
>>>> pool=ThreadedConnectionPool(0,5,<connection_args>)
>>>> conn1=pool.getconn()
>>>> <do whatever with conn1>
>>>> pool.putconn(conn1)
> .... repeat later, or perhaps "simultaneously" in a different thread.
> 
> and my understanding was that the pool logic was something like the 
> following:
> 
> - create a "pool" of connections, with an initial number of
> connections equal to the "minconn" argument
> - When getconn is called, see if there is an available connection. If
> so, return it. If not, open a new connection and return that (up to
> "maxconn" total connections)
> - When putconn is called, return the connection to the pool for
> re-use, but do *not* close it (unless the close argument is specified
> as True, documentation says default is False)
> - On the next request to getconn, this connection is now available and
> so no new connection will be made
> - perhaps (or perhaps not), after some time, unused connections would
> be closed and purged from the pool to prevent large numbers of only
> used once connections from laying around.
> 
> However, in some testing I just did, this doesn't appear to be the
> case, at least based on the postgresql logs. Running the following
> code:
> 
>>>> pool=ThreadedConnectionPool(0,5,<connection_args>)
>>>> conn1=pool.getconn()
>>>> conn2=pool.getconn()
>>>> pool.putconn(conn1)
>>>> pool.putconn(conn2)
>>>> conn3=pool.getconn()
>>>> pool.putconn(conn3)
> 
> produced the following output in the postgresql log:
> 
> 2017-06-02 14:30:26 AKDT LOG:  connection received: host=::1 port=64786
> 2017-06-02 14:30:26 AKDT LOG:  connection authorized: user=logger
> database=flightlogs
> 2017-06-02 14:30:35 AKDT LOG:  connection received: host=::1 port=64788
> 2017-06-02 14:30:35 AKDT LOG:  connection authorized: user=logger
> database=flightlogs
> 2017-06-02 14:30:46 AKDT LOG:  disconnection: session time:
> 0:00:19.293 user=logger database=flightlogs host=::1 port=64786
> 2017-06-02 14:30:53 AKDT LOG:  disconnection: session time:
> 0:00:17.822 user=logger database=flightlogs host=::1 port=64788
> 2017-06-02 14:31:15 AKDT LOG:  connection received: host=::1 port=64790
> 2017-06-02 14:31:15 AKDT LOG:  connection authorized: user=logger
> database=flightlogs
> 2017-06-02 14:31:20 AKDT LOG:  disconnection: session time:
> 0:00:05.078 user=logger database=flightlogs host=::1 port=64790
> 
> Since I set the maxconn parameter to 5, and only used 3 connections, I
> wasn't expecting to see any disconnects - and yet as soon as I do
> putconn, I *do* see a disconnection. Additionally, I would have
> thought that when I pulled connection 3, there would have been two
> connections available, and so it wouldn't have needed to connect
> again, yet it did. Even if I explicitly say close=False in the putconn
> call, it still closes the connection and has to open
> 
> What am I missing? From this testing, it looks like I get no benefit
> at all from having the connection pool, unless you consider an upper
> limit to the number of simultaneous connections a benefit? :-) Maybe a
> little code savings from not having to manually call connect and close
> after each connection, but that's easily gained by simply writing a
> context manager. I could get *some* limited benefit by raising the
> minconn value, but then I risk having connections that are *never*
> used, yet still taking resources on the DB server.
> 
> Ideally, it would open as many connections as are needed, and then
> leave them open for future requests, perhaps with an "idle" timeout.
> Is there any way to achieve this behavior?
> 
> -----------------------------------------------
> Israel Brewster
> Systems Analyst II
> Ravn Alaska
> 5245 Airport Industrial Rd
> Fairbanks, AK 99709
> (907) 450-7293
> -----------------------------------------------




More information about the Python-list mailing list