使用Java从csv到Oracle DB中的表的大容量插入

问题描述 投票:0回答:1

我正在尝试使用java在Oracle DB中插入表。我正在使用OpenCSV逐行读取csv文件。 csv大约有50000行9列。这是我的一些代码:

            /* Create Connection objects */
            Class.forName ("oracle.jdbc.OracleDriver"); 
            Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@HoSt", "UsErNaMe", "PaSsWoRd");
            PreparedStatement sql_statement = null;
            String jdbc_insert_sql = "INSERT INTO METATADA_AUTOSYS"
                            + "(MACH_NAME,JOB_NAME,SCRIPT_COMMAND,APPLICATION_NAME,JOB_ID,STATUS,CREATE_DATE,LAST_START_DT,LAST_END_DT) VALUES"
                            + "(?,?,?,?,?,?,?,?,?)";
            sql_statement = conn.prepareStatement(jdbc_insert_sql);
            /* Read CSV file in OpenCSV */
            String inputCSVFile = "C:/Users/conwacx/Desktop/meta_auto_v3/Autosys_Metadata.csv";
            CSVReader reader = new CSVReader(new FileReader(inputCSVFile));         
            String [] nextLine; 
            int lnNum = 0; 
            int batchSize = 5000;
            //loop file , add records to batch
            try{    
                while ((nextLine = reader.readNext()) != null) {
                    lnNum++;
                    /* Bind CSV file input to table columns */
                    sql_statement.setString(1, nextLine[0]);
                    sql_statement.setString(2,nextLine[1]);
                    sql_statement.setString(3,nextLine[2]);
                    sql_statement.setString(4,nextLine[3]);
                    sql_statement.setString(5,nextLine[4]); //setInt(Integer.parseInt(nextLine[4].trim());
                    sql_statement.setString(6,nextLine[5]);
                    sql_statement.setObject(7, nextLine[5]);
                    sql_statement.setString(8,nextLine[7]);
                    sql_statement.setString(9,nextLine[8]);
                    sql_statement.addBatch();
                    // Add the record to batch
                    if (++batchSize % 5000 == 0){
                            sql_statement.executeBatch();
                    }



            }
            sql_statement.executeBatch();
        }
            catch(SQLException e){
                e.printStackTrace();
            }                 
            //Perform a bulk batch insert              
            int[] totalRecords = new int[7];
            try {
                    totalRecords = sql_statement.executeBatch();
            } catch(BatchUpdateException e) {
                    //handle exception for failed records here
                    totalRecords = e.getUpdateCounts();
            } catch(SQLException ex){
                    ex.printStackTrace();
            }
            System.out.println ("Total records inserted in bulk from CSV file " + totalRecords.length);                
            /* Close prepared statement */
            sql_statement.close();
            /* COMMIT transaction */
            conn.commit();
            /* Close connection */
            conn.close();
    }

我在运行此程序时未收到错误。正在打印:Total records inserted in bulk from CSV file 0该表未使用Oracle中的新值更新。有什么建议么?

java oracle insert-update opencsv
1个回答
1
投票

如果批量达到,则仅执行一次sql_statement.executeBatch()executeBatch()返回一个带有结果的数组(受影响的行数)。因此,您必须添加数组的每个元素以计算总计数。执行批处理的条件也是错误的。我无法证明,但我会像这样更改您的示例(仅更改了部分):

  public void insertData() throws ClassNotFoundException, SQLException, IOException {
/* Create Connection objects */
Class.forName("oracle.jdbc.OracleDriver");
String jdbc_insert_sql = "INSERT INTO METATADA_AUTOSYS"
    + "(MACH_NAME,JOB_NAME,SCRIPT_COMMAND,APPLICATION_NAME,JOB_ID,STATUS,CREATE_DATE,LAST_START_DT,LAST_END_DT) VALUES"
    + "(?,?,?,?,?,?,?,?,?)";

int totalRecords = 0;
final int batchSize = 5000;
/* Read CSV file in OpenCSV */
String inputCSVFile = "C:/Users/conwacx/Desktop/meta_auto_v3/Autosys_Metadata.csv";
try (CSVReader reader = new CSVReader(new FileReader(inputCSVFile))) {
  try (Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@HoSt", "UsErNaMe", "PaSsWoRd")) {
    try (PreparedStatement sql_statement = conn.prepareStatement(jdbc_insert_sql);) {
      String[] nextLine;
      int lnNum = 0;
      // loop file , add records to batch
      try {
        int[] results = null;
        while ((nextLine = reader.readNext()) != null) {
          lnNum++;
          /* Bind CSV file input to table columns */
          sql_statement.setString(1, nextLine[0]);
          sql_statement.setString(2, nextLine[1]);
          sql_statement.setString(3, nextLine[2]);
          sql_statement.setString(4, nextLine[3]);
          sql_statement.setString(5, nextLine[4]);
          sql_statement.setString(6, nextLine[5]);
          sql_statement.setObject(7, nextLine[5]);
          sql_statement.setString(8, nextLine[7]);
          sql_statement.setString(9, nextLine[8]);
          sql_statement.addBatch();
          // Add the record to batch
          if (lnNum >= batchSize) {
            // Perform a bulk batch insert
            // separate in method doExecute()
            try {
              results = sql_statement.executeBatch();
              for (int i = 0; i < results.length; i++) {
                totalRecords += results[i];
              }
            } catch (BatchUpdateException e) {
              // handle exception for failed records here
              results = e.getUpdateCounts();
              for (int i = 0; i < results.length; i++) {
                totalRecords += results[i];
              }
            } catch (SQLException ex) {
              ex.printStackTrace();
            }
            lnNum = 0;
          }
        }
        // insert the last
        if ( lnNum >= 0 ) {
          // separate in method doExecute()
          try {
            results = sql_statement.executeBatch();
            for (int i = 0; i < results.length; i++) {
              totalRecords += results[i];
            }
          } catch (BatchUpdateException e) {
            // handle exception for failed records here
            results = e.getUpdateCounts();
            for (int i = 0; i < results.length; i++) {
              totalRecords += results[i];
            }
          } catch (SQLException ex) {
            ex.printStackTrace();
          }
        }
      } catch (SQLException e) {
        e.printStackTrace();
      }
    }
    System.out.println("Total records inserted in bulk from CSV file " + totalRecords);
    /* COMMIT transaction */
    conn.commit();
  }
}

}

© www.soinside.com 2019 - 2024. All rights reserved.