[JDBC]批量提交插入语句以提高数据插入速度(效率提升不明显)
// Initialize conn&stmt
Connection conn=null;
Statement stmt=null;
...
conn=dataSource.getConnection();
stmt = conn.createStatement();
...
conn.setAutoCommit(false);
stmt = conn.createStatement();
for(int i=0;i<recordCount;i++) {
String insertSql=getInsertSql(tableName,typefields,currTime,i);
stmt.addBatch(insertSql);
currTime=timePastNSecond(currTime,nSeconds);
if( (i!=0) && (i % 1000==0) ) { // 这里控制壹千条插入语句一提交
stmt.executeBatch();
stmt.clearBatch();
conn.commit();
logger.info("."+index+" 1000 records have been inserted to table:'"+tableName+"'.");
}
}
// 最后再提交一次
stmt.executeBatch();
stmt.clearBatch();
conn.commit();
这个方法试下来,在我遇到的Oracle(Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production )上, 插入638万条数据(两张大表一个三百万,其余19张小表每张两万)花费9小时多,而之前的插入语句(一条insert一提交)插入419万条数据(两张大表一个二百万,其余19张小表每张一万)花费6个半小时,感觉提升并不明显。当然,我得到的sql语句因为表不一样造成Insert语句不一致,可能也是效率提升不明显的原因。
我的原有方案是这样写的:
conn.setAutoCommit(false);
for(int i=0;i<recordCount;i++) {
StringBuilder sb=new StringBuilder();
sb.append("insert into "+tableName+"(");
List<String> fields=new ArrayList<String>();
for(TypeField tf:typefields) {
fields.add(tf.field);
}
sb.append(String.join(",",fields));
sb.append(") values(");
List<String> values=new ArrayList<String>();
for(TypeField tf:typefields) {
if(tf.type.equals("PK")) {
if(tableName.equals("DELIVERY_INFO_HISTORY")) {
values.add("'0'");
}else {
values.add("'"+String.valueOf(i)+"'");
}
}else if(tf.type.equals("CH")) {
values.add("'0'");
}else if(tf.type.equals("DT")) {
values.add("to_date('"+currTime+"','yyyy-MM-dd HH24:mi:ss')");
}else if(tf.type.equals("US")) {
values.add("'UserABC'");
}
}
sb.append(String.join(",",values));
sb.append(")");
String insertSql=sb.toString();
insertedActual+=stmt.executeUpdate(insertSql);
currTime=timePastNSecond(currTime,nSeconds);
if( recordCount>0 && recordCount % 1000==0 ) {
conn.commit();
}
}
conn.commit();
logger.info("#"+index+" "+insertedActual+" records(expected:"+recordCount+") have been inserted to table:'"+tableName+"'.");
只是纯Insert语句插入提交,没想速度居然差不多。真应了那句话,纸上得来终觉浅,绝知此事要躬行。
参考资料:
1. https://www.cnblogs.com/myseries/p/11191134.html
2.https://www.cnblogs.com/shizhijie/p/7458813.html
--END-- 2019-10-10 8:15
[JDBC]批量提交插入语句以提高数据插入速度(效率提升不明显)的更多相关文章
- jdbc 01: 连接mysql,并实现数据插入
jdbc连接mysql,并实现数据插入 package com.examples.jdbc.o1_连接与插入; import java.sql.*; /* jdbc数据库连接六步 */ public ...
- php中bindValue的批量提交sql语句
php预编译sql语句,可以批量提交sql,也可以实现防注入 <?php $dsn='mysql:host=127.0.0.1;port=3306;dbname=bisai'; $usernam ...
- 将Sql查询语句获取的数据插入到List列表里面
Sql查询语句获取的数据是分格式的,我们还用SqlDataReader来做,然后用IDataReader来接收读取,以下是代码: //我想查询一个用户表的信息,该用户有姓名,密码,信息三列 //1.定 ...
- PostgresSQL使用Copy命令能大大提高数据导入速度
最近在做会员系统,其中会员系统有一份企业信息初始化的数据,需要从SQL Server数据库导入到PostgreSQL,单表的数据近30万.最开始的方案是在SQL Server上生成insert int ...
- Javascript高性能编程-提高数据访问速度
hasOwnProperty()仅检索实例不检索原型,in即检索实例,又检索原型 成员嵌套越深,访问速度越慢,只在必要的情况下使用对象成员. 如果在同一个函数中你要多次读 ...
- 执行插入语句时直接返回插入信息的自增id,判断是否为空
insert into userinfo(UserName,UserPass,RegTime,email)values('a','b',GETDATE(),'123@qq.com');select @ ...
- 将EXCEL中的列拼接成SQL insert插入语句
工作中经常需要将EXCEL文件中的数据导入到各种数据库,但是对于不熟悉数据库的人来说,如果直接使用命令执行导入,这无疑是一个难题,也是一个风险.这里我们直接在EXCEL文件中拼接成标准的SQL ins ...
- 解决 C++ 操作 MySQL 大量数据插入效率低下问题
往 Mysql 中,插入10000条简单数据.速度很缓慢,竟然要5分钟左右, 可是打开事务的话.一秒不到就搞定了 代码: #include <iostream> #include < ...
- MySQL:JDBC批量插入数据的效率
平时使用mysql插入.查询数据都没有注意过效率,今天在for循环中使用JDBC插入1000条数据居然等待了一会儿 就来探索一下JDBC的批量插入语句对效率的提高 首先进行建表 create tabl ...
随机推荐
- 二、LinkList及其源码解析
1.链表介绍 链表是一种物理单元上非连续,非顺序的存储结构.链表由一系列的姐点组成,结点可以在运行时动态生成.每个结点包含两个部分,一个是存储数据元素的数据域,一个是存储下一个结点的指针域 双链表是链 ...
- 转载:Java:字节流和字符流(输入流和输出流)
本文内容: 什么是流 字节流 字符流 首发日期:2018-07-24 什么是流 流是个抽象的概念,是对输入输出设备的抽象,输入流可以看作一个输入通道,输出流可以看作一个输出通道. 输入流是相对程序而言 ...
- Hadoop_14_MapReduce框架结构及其运行流程
1.MapReduce原理篇 Mapreduce是一个分布式运算程序的编程框架,是用户开发“基于hadoop的数据分析应用”的核心框架: Mapreduce核心功能是将用户编写的业务逻辑代码和自带默认 ...
- Linux系统上对其他用户隐藏进程的简单方法
mount -o remount,rw,hidepid=2 /proc 我使用的是多用户系统,大部分的用户通过ssh客户端访问他们的资源.我如何(怎么样)避免泄露进程信息给他们?如何(怎么样)在Deb ...
- Kinect视频中运用全身运动和人体测量统计学的人物识别技术
摘要: 对于人物识别技术来说,动作和人体测量统计学对于光学差异并不敏感,甚至对于眼镜,头发,帽子的描述相当粗糙,现在的以步态为基础的识别技术都是基于对细节的精确描述和对步态周期的精确测量.这种方法需要 ...
- Python 实现快递查询
实现效果: 源代码: import urllib.request import json import msvcrt kd_dict = {1:'shentong',2:'youzhengguonei ...
- Physical Education Lessons CodeForces - 915E (动态开点线段树)
Physical Education Lessons CodeForces - 915E This year Alex has finished school, and now he is a fir ...
- setTimeout,promise,promise.then, async,await执行顺序问题
今天下午看了好多关于这些执行顺序的问题 经过自己的实践 终于理解了 记录一下就拿网上出现频繁的代码来说: async function async1() { console.log('async1 ...
- FFmpeg常用命令学习笔记(八)滤镜相关命令
滤镜相关命令 FFmpeg中关于滤镜命令有很多种.比如在视频中加入/删除水印.对视频做反转等等都属于滤镜. FFmpeg滤镜处理流程 解码后的数据帧 ---过滤处理---> 过滤后的数据帧 -- ...
- fwrite() and UTF8 转载
4 down vote If you know the data is in UTF8 than you want to set up the header. I wrote a solution a ...