Re: getAutocommit assertion error

Поиск
Список
Период
Сортировка
От jenca@lysator.liu.se
Тема Re: getAutocommit assertion error
Дата
Msg-id 20181114155907.Horde.ErPLMTGZdGXb3AzgLaBULfe@webmail.lysator.liu.se
обсуждение исходный текст
Ответ на RE: getAutocommit assertion error  (adrien ruffie <adriennolarsen@hotmail.fr>)
Список pgsql-jdbc
Hi again.

TL;DR: Adrien, either your code or your test framework are closing the
connection before where you see your failure, and you need to look
into that. I suggest you find and look at the stack trace for the
AssertionError.


I have checked out the code, looking at the 42.2.2 version with the
findings below.

1. I assume the assertion error is thrown from
org.postgresql.jdbc.BatchResultHandler, row 105:

101:  private boolean isAutoCommit() {
102:    try {
103:      return pgStatement.getConnection().getAutoCommit();
104:    } catch (SQLException e) {
105:      assert false : "pgStatement.getConnection().getAutoCommit()
should not throw";
106:      return false;
107:    }
108:  }


2. pgStatement is a org.postgresql.jdbc.PgStatement, and the method
getConnection() looks like:

871:  public Connection getConnection() throws SQLException {
872:    return connection;
873:  }


3. The connection is a org.postgresql.core.BaseConnection, an
interface, with only one implementing class,
org.postgresql.jdbc.PgConnection, in this code base.

4. The method org.postgresql.jdbc.PgConnection.getAutoCommit()  looks like:

727:  public boolean getAutoCommit() throws SQLException {
728:    checkClosed();
729:    return this.autoCommit;
730:  }


5. The method checkClosed() looks like:

765:  protected void checkClosed() throws SQLException {
766:    if (isClosed()) {
767:      throw new PSQLException(GT.tr("This connection has been closed."),
768:          PSQLState.CONNECTION_DOES_NOT_EXIST);
769:    }
770:  }


I am reasonable certain that the only way to trigger the assert in
BatchResultHandler is for checkClosed() to throw PSQLException. The
metod isClosed() calls
org.postgresql.core.QueryExecutorBase.isClosed() which do not throws
anything.

My conclusions is that...
- The problem is triggered by the connection being closed, which is a
problem that needs to looked at in the code under test.
- If the connection is closed, perhaps something other than an
AssertionError is better, which is something for the pgjdbc codebase.


Best regards,
///Jens Carlberg



Quoting adrien ruffie <adriennolarsen@hotmail.fr>:

> I changed it, but nothing works... same problem
>
> I am in despair.
>
> ________________________________
> De : Dave Cramer <pg@fastcrypt.com>
> Envoyé : mercredi 14 novembre 2018 14:33:40
> À : Adrien Ruffie
> Cc : pgsql-jdbc@lists.postgresql.org
> Objet : Re: getAutocommit assertion error
>
> Adrien,
>
> No reason not to use the latest
>
> 42.2.5
>
>
> Dave Cramer
>
> davec@postgresintl.com<mailto:davec@postgresintl.com>
> www.postgresintl.com<http://www.postgresintl.com>
>
>
> On Wed, 14 Nov 2018 at 08:32, adrien ruffie
> <adriennolarsen@hotmail.fr<mailto:adriennolarsen@hotmail.fr>> wrote:
>
> Sorry for this late anwser ...
>
> Dave, for the version of driver is:
>
>
>   <groupId>org.postgresql</groupId>
>   <artifactId>postgresql</artifactId>
>   <version>42.2.2</version>
>
>
> Jens,
>
> I can't debug, because the problem only appears when bamboo lannched
> my test cases ... impossible to reproduce IDE and Maven command line
> ...
>
>
> ________________________________
> De : Jens Carlberg <jens.carlberg@gmail.com<mailto:jens.carlberg@gmail.com>>
> Envoyé : mardi 13 novembre 2018 10:11:32
> À : pgsql-jdbc@lists.postgresql.org<mailto:pgsql-jdbc@lists.postgresql.org>
> Objet : Re: getAutocommit assertion error
>
> After looking at the JDBC code, the only path I see leading to this
> error is if the connection has been closed. If nothing else, this
> might give you a clue where to look in your test code.
>
> Best Regards,
> ///Jens Carlberg
>
> On Tue, 13 Nov 2018 at 09:39, Jens Carlberg
> <jens.carlberg@gmail.com<mailto:jens.carlberg@gmail.com>> wrote:
> Hi.
>
> If you can, I suggest you run in debug and put a breakpoint in the
> method, so you can examine the thrown exception (or trace the call
> deeper). In Eclipse, it would be Run -> Debug As -> Maven Test
> (assuming this is when you run the tests). I have no experience in
> how to do this in other environment, but I assume other IDE:s at
> least have similar functionality. If you are using maven on the
> command line, this thread on StackOverflow might be helpful:
> https://stackoverflow.com/questions/2935375/debugging-in-maven
>
> Best Regards,
> ///Jens Carlberg
>
>
> On Tue, 13 Nov 2018 at 09:19, adrien ruffie
> <adriennolarsen@hotmail.fr<mailto:adriennolarsen@hotmail.fr>> wrote:
>
> Hello Dave,
>
> thank you for your advise, but unfortunately that not really change ...
> even by reversing the 2 lines, I still have the problem.
>
> It's very strange in source code
>
> private booleanisAutoCommit() {
>         try {
>         return pgStatement.getConnection().getAutoCommit();
>         } catch (SQLException e) {
>         assert false : "pgStatement.getConnection().getAutoCommit()
> should not throw";
>         return false;
>         }
>         }
>
>
> because you can't really see the really SQLException which should
> throws in order ot really debug the problem ...
> I have tried to find in postgres site, in jdbc driver topic and
> thread in internet but nothing :-(
>
>
> ________________________________
> De : adrien ruffie
> <adriennolarsen@hotmail.fr<mailto:adriennolarsen@hotmail.fr>>
> Envoyé : lundi 12 novembre 2018 14:10:50
> À : pgsql-jdbc@lists.postgresql.org<mailto:pgsql-jdbc@lists.postgresql.org>
> Objet : getAutocommit assertion error
>
>
> Hello all,
>
>
> in my java test case launched by maven I get the following exception:
>
>
> java.lang.AssertionError:
> pgStatement.getConnection().getAutoCommit() should not throw
>
>
> But I don't know why this error is returned ...
>
> In my class, I set auto commit to 'false' value, and I commit at the
> ending like this:
>
> try {
> preparedStatement.close();
> connection.commit();
> } catch (SQLException e) {
> log.error("Error while closing connection.", e.toString());
> }
>
>
> I check where the error comme from and I just found the following
> code, in BatchResultHandler:
>
>
> private boolean isAutoCommit() {
>     try {
>       return pgStatement.getConnection().getAutoCommit();
>     } catch (SQLException e) {
>       assert false : "pgStatement.getConnection().getAutoCommit()
> should not throw";
>       return false;
>     }
>   }
>
>
>
>
> I don't really understand the problem ...
>
> anyone can help me please ?
>
>
> Best regards,
>
>
> Adrien




В списке pgsql-jdbc по дате отправления:

Предыдущее
От: rob stone
Дата:
Сообщение: Re: getAutocommit assertion error
Следующее
От: Dave Cramer
Дата:
Сообщение: [pgjdbc/pgjdbc] da4d65: Remove tests that use oids fixes #1347(#1348)