Re: Return Codes of BatchUpdateException in PostgreSql 9.6 - Mailing list pgsql-jdbc
From | Tillmann Schulz |
---|---|
Subject | Re: Return Codes of BatchUpdateException in PostgreSql 9.6 |
Date | |
Msg-id | 65622026.6539291.1476877760626@mail.yahoo.com Whole thread Raw |
In response to | Return Codes of BatchUpdateException in PostgreSql 9.6 (Tillmann Schulz <tillmann73@yahoo.de>) |
Responses |
Re: Return Codes of BatchUpdateException in PostgreSql 9.6
(Jeremy Whiting <jwhiting@redhat.com>)
|
List | pgsql-jdbc |
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 ); } }
pgsql-jdbc by date: