Re: Couple of preparedstatement bug suspects - Mailing list pgsql-jdbc

From Roy Smith
Subject Re: Couple of preparedstatement bug suspects
Date
Msg-id 6a1128300805082141x4d239a9ft4c78ffc0f9082ae0@mail.gmail.com
Whole thread Raw
In response to Couple of preparedstatement bug suspects  ("Roy Smith" <roy.smith@primetext.com>)
Responses Re: Couple of preparedstatement bug suspects  (Kris Jurka <books@ejurka.com>)
List pgsql-jdbc
Hi Kris

Thanks for the quick response.

No the app is not multithreaded. It's a web app and I'm the only user on my local test PC. So I start tomcat, run a single post which generates the error, stop tomcat.

I didn't understand your 2nd point. When I call PreparedStatement.executeUpdate() I have to know that the row did or did not get written. If there is a situation that an exception can be thrown after the data has been written, that exception needs to be unambiguous in telling the caller that the data is written or not.

I'm happy to provide any debug/logs which help you with this one, just let me know.

best
Roy



On Fri, May 9, 2008 at 5:14 AM, Kris Jurka <books@ejurka.com> wrote:


On Fri, 9 May 2008, Roy Smith wrote:

I have an app which inserts rows to a table called messages. During load testing, I'm looping to insert 10,000 rows. Intermittentently (around 5% and only after the first 6,000 or so) I'm getting the following Exception...

org.postgresql.util.PSQLException: This statement has been closed.
  at
org.postgresql.jdbc2.AbstractJdbc2Statement.checkClosed(AbstractJdbc2Statement.java:2442)
  at
org.postgresql.jdbc2.AbstractJdbc2Statement.getUpdateCount(AbstractJdbc2Statement.java:495)
  at
org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:309)
  at com.primetext.tl2000.dataobjects.Messages.insert(Messages.java:566)

This smells like a bug. There are other updates within my loop, and I can't promise that I'm closing all statements. Therefore if this bug is being triggered by me abusing the driver, please confirm and I'll go through all of my code ensuring that all preparedstatements are being closed.


Is your app multi-threaded?  The only way I see for this to happen is that one thread is executing the statement and another is closing it.


However, there is a another aspect of this which smells like an even bigger bug... Even though the PreparedStatement.executeUpdate is throwing an exception, the row *is* being written to the database!! This can't possibly be valid.


The exception is from the driver, not the server and it happens after the query has been executed by the server.  Once the server has committed the data, there's not much the driver can do about that.

Kris Jurka

pgsql-jdbc by date:

Previous
From: Kris Jurka
Date:
Subject: Re: Couple of preparedstatement bug suspects
Next
From: dombrd@gmail.com
Date:
Subject: Re: Correct getScale() behavior?