通过数组方式向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秒

时间: 2024-11-08 20:15:22

通过数组方式向Oracle大批量插入数据(10万条11秒)的相关文章

MySQL大批量插入数据

MySQL大批量插入数据 1. 对于Myisam类型的表,可以通过以下方式快速的导入大量的数据. ALTER  TABLE  tblname  DISABLE  KEYS; loading  the  data ALTER  TABLE  tblname  ENABLE  KEYS; 这两个命令用来打开或者关闭Myisam表非唯一索引的更新.在导入大量的数据到一 个非空的Myisam表时,通过设置这两个命令,可以提高导入的效率.对于导入大量 数据到一个空的Myisam表,默认就是先导入数据然后才

mysql大批量插入数据的4种方法示例

前言 本文主要给大家介绍了关于mysql大批量插入数据的4种方法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 方法一:循环插入 这个也是最普通的方式,如果数据量不是很大,可以使用,但是每次都要消耗连接数据库的资源. 大致思维如下 (我这里写伪代码,具体编写可以结合自己的业务逻辑或者框架语法编写) ? 1 2 3 4 5 6 7 8 9 10 11 12 13 for($i=1;$i<=100;$i++){  $sql = 'insert...............';  /

MyBatis在Oracle中插入数据并返回主键的问题解决

引言:  在MyBatis中,希望在Oracle中插入数据之时,同时返回主键值,而非插入的条数... 环境:MyBatis 3.2 , Oracle, Spring 3.2   SQL Snippet in XML Configuration: <insert id="insertSelective" parameterType="com.jxxx.p2pp.model.UUserInfo"> <selectKey resultType="

SqlBulkCopy类进行大数据(10000万条以上)插入测试

好多天没写博客了,刚刚毕业一个多月,在IT的路上真是迷茫啊! 关于上一篇博客中提到的,在进行批量数据插入数据库的时候可以通过给存储过程传递一个类型为Table的参数进行相关操作,在这个过程中本人没有进行效率的测试.后来查找发现可以通过SqlBulkCopy类进行大数据插入操作,本文就来介绍一个这个类的作用并做了相关的效率测试(与Insert语句进行对比). SqlBulkCopy只能向SqlServer表写入数据,该表既可以是同一个服务器上的也可以是远程服务器上的.当然要写入的数据即数据源不单单

java 批量插入10万条数据

for (int i = 0; i < 100000; i++) { dbHelper.insert("INSERT aaa(name) Values ('1')"); } 运行时间==780450ms conn = getConn(); // JAVA默认为TRUE,我们自己处理需要设置为FALSE,并且修改为手动提交,才可以调用rollback()函数 conn.setAutoCommit(false); st = conn.createStatement(); long s

【转】Oracle中如何用一条SQL快速生成10万条测试数据

转自http://blog.csdn.net/welken/article/details/4971887 做数据库开发或管理的人经常要创建大量的测试数据,动不动就需要上万条,如果一条一条的录入,那会浪费大量的时间,本文介绍了Oracle中如何通过一条SQL快速生成大量的测试数据的方法. 产生测试数据的SQL如下: SQL> select rownum as id,  2                 to_char(sysdate + rownum / 24 / 3600, 'yyyy-mm

C# DataGirdView 填充10万条数据

DataGirdView 填充10万条数据,用以下方式基本耗时 2秒 DataTable dt = new DataTable();DataColumn dc1 = new DataColumn("Column1");DataColumn dc2 = new DataColumn("Column2");DataColumn dc3 = new DataColumn("Column3");dt.Columns.Add(dc1);dt.Columns

一般数据存储和批量数据存储比较--10万条数据

一.在数据库中建立Student表 二.创建10万条数据 创建数据 三.创建一般数据存储方法 public static void SaveGeneral(DataTable dt) { string strConn = @"Data Source=.;Initial Catalog=Test;Integrated Security=True"; SqlConnection conn = new SqlConnection(strConn); conn.Open(); SqlComma

百亿级数据10万字段属性的秒级检索解决方案以及实现

课程下载地址: https://pan.baidu.com/s/1zr5riwZtdRgnVQRetQnG7A 提取码: 5xg8 平台型创业型公司,会有多个品类,像生活信息服务类网站的有:58同城,赶集网等等,他们的类别非常多,每个垂直领域都会分为很多类别,每 个类别下又分很多子类别,每个类别或者子类别的属性都不一样,像这么庞大的数据,字段属性可以达到10万级别,同时数据量可以达到百亿级别 ,很多异构数据的存储需求.基于这么庞大的数据,我们需要达到秒级查询. 那么我们该怎么设计呢?本课程讲手把