Re: Statement.setQueryTimeout() with autoCommit=false

From: "David Johnston" <polobo(at)yahoo(dot)com>
To: 'Pavel Arnošt' <pavel(dot)arnost(at)loutka(dot)cz>, <pgsql-jdbc(at)postgresql(dot)org>
Subject: Re: Statement.setQueryTimeout() with autoCommit=false
Date: 2012-12-06 20:55:53
Message-ID: 016a01cdd3f4$15296dd0$3f7c4970$@yahoo.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-jdbc

The statement timeout that you provided is attached to the INSERT statement
- which executed just fine even though it wasn't comitted. The exception
you are seeing in the "autoCommit(false)" scenario occurs at "conn.commit()"
which implicitly executes "COMMIT;" on the backend and fails due to the
replication situation.

In "autocommit" mode the commit is executed as part of the same statement as
the INSERT (it is a compound statement I guess) and as such the timeout is
still in effect at that time.

David J.

> -----Original Message-----
> From: pgsql-jdbc-owner(at)postgresql(dot)org [mailto:pgsql-jdbc-
> owner(at)postgresql(dot)org] On Behalf Of Pavel Arnošt
> Sent: Thursday, December 06, 2012 3:26 PM
> To: pgsql-jdbc(at)postgresql(dot)org
> Subject: Re: [JDBC] Statement.setQueryTimeout() with autoCommit=false
>
> That insert was against PostgreSQL server with synchronous replication and
> dead slave.
>
> On Thursday, December 6, 2012 9:18:48 PM UTC+1, Dave Cramer wrote:
> > Well my point was that that insert statement shouldn't last long enough
to
> time out ?
> >
> >
> > Dave
> >
> > Dave Cramer
> >
> > dave.cramer(at)credativ(dot)ca
> > http://www.credativ.ca
> >
> >
> >
> >
> >
> >
> >
> > On Thu, Dec 6, 2012 at 1:36 PM, David Johnston <pol(dot)(dot)(dot)(at)yahoo(dot)com>
> wrote:
> >
> >
> >
> > > -----Original Message-----
> >
> > > From: pgsql-jd(dot)(dot)(dot)(at)postgresql(dot)org [mailto:pgsql-jdbc-
> >
> > > ow(dot)(dot)(dot)(at)postgresql(dot)org] On Behalf Of dmp
> >
> > > Sent: Thursday, December 06, 2012 1:15 PM
> >
> > > To: pgsql(dot)(dot)(dot)(at)postgresql(dot)org
> >
> > > Cc: pavel(dot)(dot)(dot)(dot)(at)loutka(dot)cz
> >
> > > Subject: Re: [JDBC] Statement.setQueryTimeout() with
> > > autoCommit=false
> >
> > >
> >
> > > Exactly.
> >
> > >
> >
> > > According to the Java API:
> >
> > >
> >
> > > void setAutoCommit(boolean autoCommit) throws SQLException
> >
> > >
> >
> > >      Sets this connection's auto-commit mode to the given state. If
> > > a
> >
> > > connection is in auto-commit mode, then all its SQL statements will
> > > be
> >
> > > executed and committed as individual transactions. Otherwise, its
> > > SQL
> >
> > > statements are grouped into transactions that are terminated by a
> > > call to
> >
> > > either the method commit or the method rollback. By default, new
> >
> > > connections are in auto-commit mode.
> >
> > >
> >
> > > By setting setAutoCommit(false) you are deciding to tell the
> > > database your
> >
> > > code will determine when to commit the transaction. Thereby I would
> > > say
> >
> > > overiding setQueryTimeout().
> >
> > >
> >
> > > danap.
> >
> >
> >
> > Even within an manually administered transaction the setting of
> >
> > "setQueryTimeout()" will (should?) act on the individual statements
> > that
> >
> > make up the transaction.  If any individual statement within the
> > transaction
> >
> > exceeds the limit that statement will fail and thus put the
> > transaction into
> >
> > a "failed" state where a rollback (possibly to savepoint) is required.
> > The
> >
> > transaction itself does not constitute a statement and as such it can
> > run
> >
> > indefinitely long regardless of the presence of a statement timeout.
> >
> >
> >
> > David J.
> >
> >
> >
> >
> >
> > >
> >
> > > Dave Cramer wrote:
> >
> > > > Why would the query timeout at all ?
> >
> > > >
> >
> > > > The query timeout is for long running queries. If the query takes
> >
> > > > longer than n seconds it will timeout.
> >
> > > >
> >
> > > > Dave
> >
> > > >
> >
> > > > Dave Cramer
> >
> > > >
> >
> > > > dave.cramer(at)credativ(dot)ca
> >
> > > > http://www.credativ.ca
> >
> > > >
> >
> > > >
> >
> > > >
> >
> > > > On Thu, Dec 6, 2012 at 12:04 PM, <pavel(dot)(dot)(dot)(dot)(at)loutka(dot)cz
> >
> > > > <mailto:pavel(dot)(dot)(dot)(dot)(at)loutka(dot)cz>> wrote:
> >
> > > >
> >
> > > >     Hi,
> >
> > > >
> >
> > > >     does setQueryTimeout work with autoCommit=false? When
> > > > autoCommit
> >
> > > is
> >
> > > >     true, this code timeouts after 5 seconds (as expected):
> >
> > > >
> >
> > > > ~
> >
> > >  > ~
> >
> > >  > ~
> >
> > > >     --
> >
> > > >
> >
> > > >     But if I set autoCommit to false, this code timeouts after 30
> >
> > > >     seconds on read timeout:
> >
> > > >
> >
> > > >     --
> >
> > > > ~
> >
> > >  > ~
> >
> > >  > ~
> >
> > > >     --
> >
> > > >
> >
> > > >     I'm confused what's setQueryTimeout() method for, why it
> > > > doesn't
> >
> > > >     work with manual transactions?
> >
> > >
> >
> > >
> >
> > > --
> >
> > > Sent via pgsql-jdbc mailing list (pgsql(dot)(dot)(dot)(at)postgresql(dot)org) To make
> >
> > changes
> >
> > > to your subscription:
> >
> > > http://www.postgresql.org/mailpref/pgsql-jdbc
> >
> >
> >
> >
> >
> >
> >
> > --
> >
> > Sent via pgsql-jdbc mailing list (pgsql(dot)(dot)(dot)(at)postgresql(dot)org)
> >
> > To make changes to your subscription:
> >
> > http://www.postgresql.org/mailpref/pgsql-jdbc
>
>
>
> --
> Sent via pgsql-jdbc mailing list (pgsql-jdbc(at)postgresql(dot)org) To make
changes
> to your subscription:
> http://www.postgresql.org/mailpref/pgsql-jdbc

In response to

Browse pgsql-jdbc by date

  From Date Subject
Next Message David Johnston 2012-12-06 21:03:17 Re: Statement.setQueryTimeout() with autoCommit=false
Previous Message Dave Cramer 2012-12-06 20:53:09 Re: Statement.setQueryTimeout() with autoCommit=false