zoukankan      html  css  js  c++  java
  • 通过数组方式向Oracle大批量插入数据(10万条11秒)

    1.创建数据库Person

    CREATE TABLE Person( 
    id number,
    name nvarchar2(200) ,
    age number ,
    sex nvarchar2(200) ,
    password nvarchar2(200)
    )

    2.在数据库建立一个type,对应JAVA端要传入的对象结构:

       CREATE OR REPLACE TYPE BUT_UKBNOV_CTC_ORDER_REC1 AS OBJECT (
      id number,
       name nvarchar2(200) ,
       age number ,
       sex  nvarchar2(200) ,
       password  nvarchar2(200)
    
    )
    

     3.为了数组传输,建立一个数组类型的type:

    CREATE OR REPLACE TYPE BUT_UKBNOV_CTC_ORDER_TAB AS TABLE OF BUT_UKBNOV_CTC_ORDER_REC1

    4,建立存储过程做插入工作:

       create or replace procedure bulkInsertCTDORDER(i_orders IN BUT_UKBNOV_CTC_ORDER_TAB)
    as
    ctcOrder BUT_UKBNOV_CTC_ORDER_REC1;
    begin
        FOR idx IN 1..i_orders.COUNT   LOOP
            ctcOrder:=i_orders(idx);
            INSERT INTO person
              (id,
               name,
               age,
               sex,
               password
               )
            VALUES
              (ctcOrder.id,
               ctcOrder.name,
                ctcOrder.age,
                 ctcOrder.sex,
                  ctcOrder.password
               );
        end loop;
        exception when others then
        raise;
    end;

    5,建立JAVA端java bean对象

    package me.person;
    
    public class Person {
    public int getId() {
    return id;
    }
    public void setId(int id) {
    this.id = id;
    }
    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;
    }
    public int getAge() {
    return age;
    }
    public void setAge(int age) {
    this.age = age;
    }
    public String getSex() {
    return sex;
    }
    public void setSex(String sex) {
    this.sex = sex;
    }
    public String getPassword() {
    return password;
    }
    public void setPassword(String password) {
    this.password = password;
    }
    private int id;
    private String name;
    private int age;
    private String sex;
    private String password;
    }

    6.在JAVA端访问存储过程插入数据,需要做JAVA数据类型和存储过程类型type的映射,下面的StructDescriptor是mapping Oracle端AS OBJECT类型,
    tabDesc 是mapping Oracle端数组 AS TABLE OF类型的.

    package me.arrayinsertbatch;
    
    import java.sql.CallableStatement;
    import java.sql.Connection;
    import java.util.ArrayList;
    import java.util.List;
    
    import org.springframework.stereotype.Service;
    
    import me.person.Person;
    import oracle.sql.ARRAY;
    import oracle.sql.ArrayDescriptor;
    import oracle.sql.STRUCT;
    import oracle.sql.StructDescriptor;
    @Service("insertbatchservive")
    public class ArraybatchInsertFromExcel {
         public void insertbatchfromexcel() throws Exception//10万条11秒
         {
             double begin = System.currentTimeMillis();
             Connection con = null;  
             CallableStatement cstmt = null;       
             try {                 
                 con = ArrayInsertBatch.getConn();  
               List<Person> orderList = new ArrayList<Person>();  
                
                 for(int i=0;i<100000;i++){ 
                     Person per=new Person();
                     per.setId(i);
                     per.setName("InsertName"+i);
                        per.setPassword("insertpassword"+i);
                        per.setSex("男");
                        per.setAge(i);
                     orderList.add(per);  
                 }   
                 //JSONArray json=JSONArray.fromObject(orderList);
                 //System.out.println(json.toString());
                 StructDescriptor recDesc = StructDescriptor.createDescriptor("BUT_UKBNOV_CTC_ORDER_REC1",  con);  
                 ArrayList<STRUCT> pstruct = new ArrayList<STRUCT>();  
                 for (Person ord:orderList) {                  
                     Object[] record = new Object[5];  
                     record[0] = ord.getId();  
                     record[1] = ord.getName();  
                     record[2] = ord.getAge();  
                     record[3] = ord.getSex();  
                     record[4] = ord.getPassword(); 
                   // JSONArray json1=JSONArray.fromObject(record);
                //  System.out.println(json1.toString());
                         //System.out.println(record[4].toString());
                     STRUCT item = new STRUCT(recDesc, con, record);                  
                     pstruct.add(item);  
                 }  
                 //JSONArray json2=JSONArray.fromObject(pstruct);
                // System.out.println(json2.toString());
                 ArrayDescriptor tabDesc = ArrayDescriptor.createDescriptor("BUT_UKBNOV_CTC_ORDER_TAB", con);              
                 ARRAY vArray = new ARRAY(tabDesc, con, pstruct.toArray()); 
                 
                 //JSONArray json=JSONArray.fromObject(pstruct.toArray());
                // System.out.println(json.toString());
                 cstmt = con.prepareCall("{call bulkInsertCTDORDER(?)}");       
                 cstmt.setArray(1, vArray); 
                 //cstmt.setString(2, SYSJ);
                //    cstmt.setString(4, QYSJ);
                 cstmt.execute();  
                 con.commit();  
                  double time = (System.currentTimeMillis() - begin) / 1000;
                  System.out.println("插入共花费时间" + time + "s");
         
         
         }
             catch(Exception ex)
             {
                 
                 throw ex;
             }
        }
    }

    上面的示例在插入10万条记录只用了11秒

  • 相关阅读:
    Java动态绑定和静态绑定-多态
    Java方法内联
    Java反射机制及原理
    Jvm-类加载机制
    Zookeeper 源码解析-环境准备
    SpringMvc源码解析
    Java虚拟机的意义
    起跑线
    js动态生成html,onclick事件失效解决方法
    虚拟机能ping通,但是telnet某个端口却不行
  • 原文地址:https://www.cnblogs.com/cl1255674805/p/5130393.html
Copyright © 2011-2022 走看看