Re: PrepareStatement.execute() blocked because of long time 'create index' operation, connection leak

From: Vladimir Sitnikov <sitnikov(dot)vladimir(at)gmail(dot)com>
To: Dave Cramer <pg(at)fastcrypt(dot)com>, "jingzhi(dot)zhang(at)outlook(dot)com" <jingzhi(dot)zhang(at)outlook(dot)com>
Cc: List <pgsql-jdbc(at)postgresql(dot)org>
Subject: Re: PrepareStatement.execute() blocked because of long time 'create index' operation, connection leak
Date: 2016-06-07 11:37:42
Message-ID: CAB=Je-HUF8r_Fe__NuUHJ+OY0dmOa60P=C+L5vj2tUS8YfF=Bw@mail.gmail.com
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-jdbc

Jingzhi>I use jdbc to create index on a table, the sql of 'create index'
cost about 30 minutes.
Jingzhi>Finally I found, the jdbc client thread blocked at
PrepareStatement.execute(), not finished.
Jingzhi>At server side, query pg_stat_activity, the connection state
already be ‘idle’ (index creation finished).

Jingzhi, Do you have a firewall in between app and the database?
Can it terminate the connection while index is being built?

Dave>You may have to execute the execute() in a background thread to not
block the main thread

Dave, I'm afraid it looks like we need keep-alive messages for such
long-running transactions.
There's tcpKeepAlive, however it has no way to set specific timeout value.
It could help to detect "broken connection" at java side, though.

It boils down to plug&pray kind of solution, so everybody should ensure
there's no firewall that could kill long-lasting TCP connections.

What if we could teach pgjdbc to send a dummy command once a while?
The drawback is it could fill up buffer at the backend side, however
sending a sync message once every 10-15 minutes sounds quite innocent.

Vladimir

In response to

Responses

Browse pgsql-jdbc by date

  From Date Subject
Next Message jingzhi.zhang@outlook.com 2016-06-07 12:01:06 Re: PrepareStatement.execute() blocked because of long time 'create index' operation, connection leak
Previous Message jingzhi.zhang@outlook.com 2016-06-07 11:36:04 Re: PrepareStatement.execute() blocked because of long time 'create index' operation, connection leak