Re: Return Codes of BatchUpdateException in PostgreSql 9.6 - Mailing list pgsql-jdbc

From Jeremy Whiting
Subject Re: Return Codes of BatchUpdateException in PostgreSql 9.6
Date
Msg-id 2138ea64-c48f-c081-960b-f20ddcc53a93@redhat.com
Whole thread Raw
In response to Re: Return Codes of BatchUpdateException in PostgreSql 9.6  (Tillmann Schulz <tillmann73@yahoo.de>)
Responses Re: Return Codes of BatchUpdateException in PostgreSql 9.6  (Tillmann Schulz <tillmann73@yahoo.de>)
Re: Return Codes of BatchUpdateException in PostgreSql 9.6  (Vladimir Sitnikov <sitnikov.vladimir@gmail.com>)
Re: Return Codes of BatchUpdateException in PostgreSql 9.6  (Tillmann Schulz <tillmann73@yahoo.de>)
Re: Return Codes of BatchUpdateException in PostgreSql 9.6  (Vladimir Sitnikov <sitnikov.vladimir@gmail.com>)
List pgsql-jdbc
Hi Tillmann,
  Thank you for providing the test case. I suggest you take a look at
this class [1] in the testsuite. It may answer your question on what to
expect in updateCount.

  If you question is not answered and the tests in that class do not
exercise what is provided in your test case then I suggest the following:

a) Create an issue [2] on Github.
b) Fork the pgjdbc project.
c) Add your contributed test into [1] as a new test method. Even better
is to include a fix along with the test case.
d) Create a Pull Request (PR) to have your test merged into master. Also
update your created issue with details of the PR. So the two are linked.

  This way the project can ensure this problem you are seeing does not
reoccur again in the future. If it is indeed a defect.

Regards,
Jeremy

[1]
https://github.com/pgjdbc/pgjdbc/blob/master/pgjdbc/src/test/java/org/postgresql/test/jdbc2/BatchExecuteTest.java
[2]  https://github.com/pgjdbc/pgjdbc/issues

On 19/10/16 12:49, Tillmann Schulz wrote:
> Hi,
>
> thanks for the response.
>
>
>
> I have a simple test program which first creates a testtable, fills it with one record and does a batch insert of 10
records.
>
> The 5th insert causes a BatchUpdateException at stmt.executeBatch() when the data is NOT commited.
>
> The question is, which return codes should be in x.getUpdateCounts().
>
>
> For better reading I placed the test programm on       http://pastebin.com/0P1S6zEc
>
>
>
> Bye,
>
> Tillmann
>
>
>
>
>
>
>
> import java.io.IOException;
> import java.sql.Connection;
> import java.sql.DriverManager;
> import java.sql.SQLException;
> import java.sql.Statement;
> import java.util.Properties;
>
>
> public class TestUpdateCount
> {
>
> public static void main( String[] args ) throws SQLException, ClassNotFoundException, IOException
> {
> //////////////////////////////////////////////////////////////////////////////////////
> // CHANGE THIS
> String dbUrl = "jdbc:postgresql://localhost:5432/db?charSet=UTF-8";
> String dbUser = "user";
> String dbPassword = "xxxx";
> //////////////////////////////////////////////////////////////////////////////////////
>
> try
> {
> Connection con = openConnection( dbUrl, dbUser, dbPassword );
> con.setAutoCommit( false );
>
> try
> {
> // Prepare Table
> Statement stmtDrop = con.createStatement();
> stmtDrop.execute( "DROP TABLE IF EXISTS TESTTABLE " );
> con.commit();
> Statement stmtCreate = con.createStatement();
> stmtCreate.execute( "CREATE TABLE TESTTABLE (id INTEGER PRIMARY KEY)" );
> con.commit();
> Statement stmtData = con.createStatement();
> stmtData.execute( "INSERT INTO TESTTABLE VALUES (5)" );
> con.commit();
>
> // TestCase: Insert 10 statements via jdbc batch.
> // 5h statement should fail because of duplicate key error
> con = openConnection( dbUrl, dbUser, dbPassword );
> con.setAutoCommit( false );
>
> Statement stmt = con.createStatement();
> for( int i = 0; i < 10; i++ )
> {
> stmt.addBatch( "INSERT INTO TESTTABLE VALUES('" + i + "')" );
> }
>
> stmt.executeBatch();
>
> con.commit();
> }
> catch( java.sql.BatchUpdateException x )
> {
> final int[] updateCounts = x.getUpdateCounts();
> for( int i = 0; i < updateCounts.length; i++ )
> {
> System.err.println( "updateCounts[" + i + "]=" + updateCounts[i] );
> }
> // First 5 statements are successfully, so update count should be 1
> for( int i = 0; i < 5; i++ )
> {
> if( updateCounts[i] != 1 )
>                          System.err.println( "Wrong information returned by driver for update Count " + i );
> }
> // 5th statement
> if( updateCounts[5] == -3 )
>                      System.err.println( "Correct information returned by driver for update Count " + 5 );
>
> }
> }
> catch( SQLException s )
> {
>
> s.printStackTrace();
>
> if( s.getNextException() != null )
> {
> s.getNextException().printStackTrace();
> }
>
> }
> catch( Exception s )
> {
>              s.printStackTrace();
> }
> }
>
>
> private static Connection openConnection( String url, String user, String password )
> throws ClassNotFoundException, SQLException, IOException
> {
> try
> {
> Class.forName( "org.postgresql.Driver" );
> }
> catch( ClassNotFoundException e )
> {
> System.err.println( "Could not load driver!" );
> throw e;
> }
> Properties props = new Properties();
> // Activate for logging
> // props.setProperty( "loglevel", "2" );
> // FileWriter fw = new FileWriter( "C:\\temp\\test12345.txt" );
> // DriverManager.setLogWriter( new PrintWriter( fw ) );
>
> props.setProperty( "user", user );
> props.setProperty( "password", password );
> return DriverManager.getConnection( url, props );
>
> }
>
> }
>
>


--
Jeremy Whiting
Senior Software Engineer, Middleware Performance Team
JBoss, by Red Hat

------------------------------------------------------------
Registered Address: RED HAT UK LIMITED, Peninsular House, 30-36 Monument Street, 4th floor, London. EC3R 8NB United
Kingdom
Registered in UK and Wales under Company Registration No. 3798903  Directors: Michael Cunningham (US), Michael ("Mike")
O'Neill(Ireland) and Eric Shander (US) 



pgsql-jdbc by date:

Previous
From: "Tsunakawa, Takayuki"
Date:
Subject: [RFC] How about changing the default value of defaultRowFetchSize?
Next
From: Tillmann Schulz
Date:
Subject: Re: Return Codes of BatchUpdateException in PostgreSql 9.6