Hi, I have a performance issue with SQLitejdbc with Java on Windows Mobile 6.5 running on a MC9190-G mobile computer. I am using sqlitejdbc-v056.jar with the NSIcom CrE-ME 4.12 JVM.
Performance of the insert is very low. I am getting about 1000 records added a minute. Any ideas the on how to improve the performance would be appreciated. Code overview: 1. Query an iSeries database with the JTOpen package to pull 56,000 records. This is fairly quick, less than 10 seconds to complete. 2. For each record returned, create an insert batch statement. 3. When 1000 records are added to the batch, execute the batch update and commit the transaction (autocommit is disabled) 4. Two pragma statements are also used when the connection is created. a. PRAGMA journal_mode=OFF; b. PRAGMA synchronous = OFF; The key sections of code: /* * PopulateItems.java * * Inserts items from the iSeries ERP into the PDA database item file * */ package com.probuild.pda; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.text.SimpleDateFormat; import java.util.Date; /** * */ public class PopulateItems { private Connection iSeriesConn; private Connection sqliteConn; public final int DB_COMMIT_COUNT = 5000; /** * Creates a new instance of PopulateItems */ public PopulateItems() { // Establish connections to iSeries and SQLite DBs try { Class.forName( "com.ibm.as400.access.AS400JDBCDriver" ); String url ="jdbc:as400://as400.dxlbr.com;S10036FD;naming=sql;errors=full;"; iSeriesConn = DriverManager.getConnection( url, "SATCP", "SATCP" ); Class.forName( "org.sqlite.JDBC" ); sqliteConn = DriverManager.getConnection("jdbc:sqlite:\\pda.db"); Statement statement = sqliteConn.createStatement(); // turn journaling off String sql = "PRAGMA journal_mode=OFF;"; statement.execute(sql); // turn journaling off sql = "PRAGMA synchronous = OFF;"; statement.execute(sql); statement.close(); sqliteConn.setAutoCommit(false); } catch (Exception e) { System.out.println ( e.getMessage() ); } } public void closeConnections ( ) { try { iSeriesConn.close(); sqliteConn.close(); } catch ( Exception e ) { System.out.println ( e.getMessage() ); } } public boolean buildItemTable (String locCode) { Statement iStmt = null; PreparedStatement pStmt = null; ResultSet iResult = null; boolean success = false; System.out.println( "Building Item Table..." ); try { pStmt = sqliteConn.prepareStatement( "INSERT INTO item VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )" ); // SKU, UPC, Alt Item, Item Desc, List Unit Of Measure, Dept Code, Mfg Item# // Vnd Item#, Min Quantity, Max Quantity, Net Item (Y/N), RISBCD (P or C) String sql = " SELECT RISKU#, RIUPC#, RIAITM, RIDESC, RILSTU, RIDEPT, RIMNF#, " + " RIVITM, RIMINQ, RIMAXQ, RINETI, RISBCD" + " FROM DRMS.DRITEMFL " + " WHERE RILOC# = " + locCode + " AND RIRLC# = 0 AND RISKU# > 50000 " + " ORDER BY RISKU#"; iStmt = iSeriesConn.createStatement(); iResult = iStmt.executeQuery( sql ); System.out.println( "iSeries select form dritemfl complete: "); int count = 0; while ( iResult.next ( ) ) { int sku = iResult.getInt( "RISKU#" ); long upc = iResult.getLong( "RIUPC#" ); //String sku = iResult.getString( "RISKU#" ); //String upc = iResult.getString( "RIUPC#" ); String alt = iResult.getString( "RIAITM" ); String desc = iResult.getString( "RIDESC" ); String uom = iResult.getString( "RILSTU" ); String dept = iResult.getString( "RIDEPT" ); String mnf = iResult.getString( "RIMNF#" ); String vendorItem = iResult.getString( "RIVITM" ); int minQ = iResult.getInt( "RIMINQ" ); int maxQ = iResult.getInt( "RIMAXQ" ); String netItem = iResult.getString( "RINETI" ); String subItemCode = iResult.getString( "RISBCD" ); pStmt.setInt( 1, sku ); pStmt.setLong( 2, upc ); pStmt.setString(3, alt.trim() ); pStmt.setString( 4, desc.replace( '\'', ' ').trim() ); pStmt.setString( 5, uom ); pStmt.setString( 6, dept ); pStmt.setString( 7, mnf.replace( '\'', ' ' ).trim() ); pStmt.setString( 8, ckDigitUPCE ( Integer.toString( sku ) ) ); pStmt.setString( 9, vendorItem ); pStmt.setInt( 10, minQ ); pStmt.setInt( 11, maxQ ); pStmt.setString( 12, netItem ); pStmt.setString( 13, subItemCode ); pStmt.addBatch(); count++; if ( count % 1000 == 0 ) { System.out.println ( " 1000 records added to item table! (" + count + ")" ); } if ( count % DB_COMMIT_COUNT == 0 ) { pStmt.executeBatch(); System.out.println ( DB_COMMIT_COUNT + " records added to item table! (" + count + ")" ); } } if ( count % DB_COMMIT_COUNT != 0 ) { pStmt.executeBatch(); } System.out.println ( count + " records added to item table!"); } catch ( SQLException e ) { System.out.println ( e.getMessage() ); } catch (Exception e ) { System.out.println ( e.getMessage() ); e.printStackTrace(); } finally { try { pStmt.close(); iResult.close(); iStmt.close(); } catch (Exception e) { System.out.println("Close connection failed: " + e.getMessage()); } } return ( success ); } } ________________________________ CONFIDENTIALITY NOTICE: This email may contain confidential and privileged material for the sole use of the intended recipient(s). Any review or use by others is strictly prohibited. Any distribution or disclosure by or to others is strictly prohibited. If you have received this communication in error, please notify the sender immediately by e-mail and delete the message and any file attachments from your computer. _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users