Re: Fwd: [ADMIN] Confuse about the behaveior of PreparedStatement.executeBatch (jdbc) - Mailing list pgsql-jdbc

From Haifeng Liu
Subject Re: Fwd: [ADMIN] Confuse about the behaveior of PreparedStatement.executeBatch (jdbc)
Date
Msg-id BLU0-SMTP1534C0E74C7BF8FD348BE51B94D0@phx.gbl
Whole thread Raw
In response to Re: Fwd: [ADMIN] Confuse about the behaveior of PreparedStatement.executeBatch (jdbc)  (dmp <danap@ttc-cmc.net>)
Responses Re: Fwd: [ADMIN] Confuse about the behaveior of PreparedStatement.executeBatch (jdbc)
Re: Fwd: [ADMIN] Confuse about the behaveior of PreparedStatement.executeBatch (jdbc)
List pgsql-jdbc
example code:

Connection conn = getConnection();
PreparedStatement pstmt = conn.prepareStatement("insert/update...");
for (A a : AList) {
    pstmt.setParameter(...);
    pstmt.addBatch();
}
pstmt.executeBatch();

I did a simple test and found that if one of the batch failed, the other update may be execute partially. when I test
with10 updates a batch, none of them are updated, when I test with 1000 updates a batch, about 700+ of them are
executed,but the failed update should be the last one, which means 999 executed updates is more reasonable than 700+.
Butreally weird thing is the getUpdateCounts method returns the reasonable information. 

I don't know what happened inside this driver. Currently I have to setAutoCommit to false and use commit/rollback to
achievemy goal. 


On Dec 14, 2012, at 11:56 PM, dmp <danap@ttc-cmc.net> wrote:

> Hello,
>
> Though a simple example of your code would provide a better response
> from the mailing list, I will speculate based on the context of the
> Java 6 API, statement class and your comments. Yes, the batch appears
> to be proceeding.
>
> Statement.executeBatch().
>
> executeBatch
>
> int[] executeBatch() throws SQLException
> ~
> ~
> ~
>          If one of the commands in a batch update fails to execute properly, this method throws a
BatchUpdateException,and a JDBC driver may or may not continue to process the remaining commands in the batch. However,
thedriver's behavior must be consistent with a particular DBMS, either always continuing to process commands or never
continuingto process commands. If the driver continues processing after a failure, the array returned by the method
BatchUpdateException.getUpdateCountswill contain as many elements as there are commands in the batch, and at least one
ofthe elements will be the following: 
> ~
> ~
> ~
>    Returns:
>        an array of update counts containing one element for each command in the batch. The elements of the array are
orderedaccording to the order in which commands were added to the batch. 
>
> Throws:
>    SQLException - if a database access error occurs, this method is called on a closed Statement or the driver does
notsupport batch statements. Throws BatchUpdateException (a subclass of SQLException) if one of the commands sent to
thedatabase fails to execute properly or attempts to return a result set. 
>
> You may be able to answer your own question by examining the int[] array that
> is returned by way of BatchUpdateException.getUpdateCounts()
>
> danap.
>
> Haifeng Liu wrote:
>>> Hi,
>>>
>>> I have a DB writer program written in Java, it do batch updates, and
>>> will try to update each record in a batch if it failed. I think no any
>>> record in a batch will be update if the batch failed, but weirdly I
>>> found a few records update twice(very little amount among all records).
>>>
>>> Well, there is less stuff about postgresql jdbc driver. I wanna know
>>> if executeBatch really keep all the records in a batch untouched when
>>> the batch failed. Any help is appreciate.
>
>



pgsql-jdbc by date:

Previous
From: dmp
Date:
Subject: Re: Fwd: [ADMIN] Confuse about the behaveior of PreparedStatement.executeBatch (jdbc)
Next
From: dmp
Date:
Subject: Re: Fwd: [ADMIN] Confuse about the behaveior of PreparedStatement.executeBatch (jdbc)