Re: Recommendations for PGBouncer interacting with HikariCP - Mailing list pgsql-jdbc

From Steven Schlansker
Subject Re: Recommendations for PGBouncer interacting with HikariCP
Date
Msg-id 4CA0AE1D-0C0B-4CEB-9CF8-20B61761ED80@gmail.com
Whole thread Raw
In response to Re: Recommendations for PGBouncer interacting with HikariCP  (Dave Cramer <pg@fastcrypt.com>)
Responses Re: Recommendations for PGBouncer interacting with HikariCP  (Dave Cramer <pg@fastcrypt.com>)
List pgsql-jdbc
> On Aug 23, 2019, at 1:39 PM, Dave Cramer <pg@fastcrypt.com> wrote:
>
> On Wed, 21 Aug 2019 at 21:03, Joseph Hammerman <jhammerman@squarespace.com> wrote:
> Hi pgsql-jdbc email distribution list,
>
> We have recently added PGBouncer into our stack. We have done this in part, to protect the database. Our Java
userbaseis accustomed to using HikariCP / Hibernate for connection pooling. They would prefer to continue to use the
connectionpooler, in order to not have GC churn on connection spin up and tear down (in addition to additional latency
introducedby having to perform the three-way handshake more often). 
>
>> Is there any published material / does anyone have any knowledge of how these tools should interact or not interact?
>
> JDBC should work fine with pgbouncer.

Most things do, although there are some caveats.  For example if you have anything attached to your server session
*outside*of a txn 
(say, server-side prepared statements or session vars)
and you configure your pgbouncer for transaction pooling, you can end up creating some extremely difficult to
understandbehaviors. 

https://pgbouncer.github.io/faq.html#how-to-use-prepared-statements-with-transaction-pooling

So you do have to be a little bit careful.

>
>> HikariCP wants to keep many long running idle_in_transaction connections open, which saturates the backend
connectionpool. 
>
> That's strange why is it keeping them in transaction ? One would think once you closed (returned the connection) it
shouldcommit it. 

My personal experience working with JDBC and HikariCP is that 99.9% of the time, "idle in transaction" means that some
programmersomewhere 
actually did not close their resource.  I did end up finding numerous bugs, both in my $WORK's code as well as in Java
librarieswe use, although to the 
best of my memory the roots of problems we found were never in either PgJDBC nor HikariCP.

To diagnose these nasty issues, we took a pretty extreme method: on every checkout from the HikariCP pool, we generate
aUUID and 
print a tagged stack trace to a file.  We then set `application_name` to "app_name-$UUID".

When our DBAs found an "idle in txn" connection that we did not know where it came from, we would immediately have the
appand could 
then look up the stack trace of the last allocation site using the application_name in pg_stat_activity.

From there it was usually straightforward, if painful, to diagnose the problem:  "Oh I opened a Hibernate session and
handedit off to a Reactive 
actor that threw an exception but it never got handled and so the Connection was never closed and the whole thing got
leaked. Whoops.  But look at how *fast* Reactive is!!!" 

Hope that gives you some ideas.




pgsql-jdbc by date:

Previous
From: Dave Cramer
Date:
Subject: Re: Recommendations for PGBouncer interacting with HikariCP
Next
From: Greg Nancarrow
Date:
Subject: Re: Procedure support improvements