通过数组方式向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秒
通过数组方式向Oracle大批量插入数据(10万条11秒)的更多相关文章
- MySQL大批量插入数据
MySQL大批量插入数据 1. 对于Myisam类型的表,可以通过以下方式快速的导入大量的数据. ALTER TABLE tblname DISABLE KEYS; loading the ...
- MyBatis在Oracle中插入数据并返回主键的问题解决
引言: 在MyBatis中,希望在Oracle中插入数据之时,同一时候返回主键值,而非插入的条数... 环境:MyBatis 3.2 , Oracle. Spring 3.2 SQL Snipp ...
- 使用mybatis向oracle数据库插入数据异常
遇到了使用mybatis向oracle数据库插入数据异常的问题, 具体的报错如下:org.springframework.jdbc.UncategorizedSQLException: ### Err ...
- oracle批量插入数据(测试)
做数据库开发或管理的人经常要创建大量的测试数据,动不动就需要上万条,如果一条一条的录入,那会浪费大量的时间,本文介绍了Oracle中如何通过一条 SQL快速生成大量的测试数据的方法.产生测试数据的SQ ...
- Mvc+Dapper+存储过程分页10万条数据
10万条数据采用存储过程分页实现(Mvc+Dapper+存储过程) 有时候大数据量进行查询操作的时候,查询速度很大强度上可以影响用户体验,因此自己简单写了一个demo,简单总结记录一下: 技术:Mvc ...
- 【转】Oracle中如何用一条SQL快速生成10万条测试数据
转自http://blog.csdn.net/welken/article/details/4971887 做数据库开发或管理的人经常要创建大量的测试数据,动不动就需要上万条,如果一条一条的录入, ...
- oracle无法插入数据
最近遇到一个问题,本来插入数据好好的,突然都不能插入了. 报错------------------->ora-01653:表无法通过128(在表空间)扩展 原因是表满了!!! 解决方案: 1. ...
- Oracle快速插入数据append
1:用merge into 进行匹配更新和插入,2: 开启并行,提高速度3: 如果可以的话加NOLOGING 不写入日志4:如果数据有规律的话,分批次执行 1.使用marge快速插入; MERGE / ...
- Oracle批量插入数据SQL语句太长出错:无效的主机/绑定变量名
Oracle数据库,用mybatic批量插入数据: <insert id="saveBatch" parameterType="io.renren.entity.N ...
随机推荐
- wireshark tls
想抓一下openfire的包看看,首先要选loopback接口,如果是在本地测试的话. 然后需要搞到rsa私钥,设置好就可以了. keytool -importkeystore -srckeystor ...
- myEclipse 8.5下SVN环境的搭建
myEclipse 8.5下SVN环境的搭建 在应用myEclips 8.5做项目时,svn会成为团队项目的一个非常好的工具,苦苦在网上寻求了一下午,终于整合好了这个环境,在这里简单介绍下,希望能为刚 ...
- (中等) POJ 2886 Who Gets the Most Candies? , 反素数+线段树。
Description N children are sitting in a circle to play a game. The children are numbered from 1 to N ...
- android 点滴记录
1.AndroidM环境下,在framework层添加代码会对jar包的package name进行检查,并提示”unknown package name of class file”怎么解决? 产生 ...
- C# Expression表达式笔记
整理了一下表达式树的一些东西,入门足够了 先从ConstantExpression 开始一步一步的来吧 它表示具有常量值的表达式 我们选建一个控制台应用程序 ConstantExpression _ ...
- INSTALL_FAILED_UPDATE_INCOMPATIBLE
安装apk的时候,报错. 解决:把所有这个apk的相关信息删除干净,隐藏较深的是设置->应用管理->这个应用的相关信息删除干净就可以了
- EclipseEE导入项目出现的那些问题
1.显示.project文件丢失, 解决方法:在eclipse中删除和该项目相同的文件名,重新import即可 2.导入没有.classpath和.project文件的项目 解决方法:目前没遇到 3. ...
- windows下Nodejs环境部署
前言 Nodejs是基于v8引擎的轻量级框架,其特点为事件驱动.非阻塞.单线程.异步回调等. Nodejs相对于其他运行在服务器端的语言,容易学习,使用方便. 本文将介绍windows下Nodejs的 ...
- bzoj2599
2599: [IOI2011]Race Time Limit: 70 Sec Memory Limit: 128 MBSubmit: 2476 Solved: 733[Submit][Status ...
- xamarin mac 之 资料
中文社区 xamarin.form 30天学习计划