// 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]批量提交插入语句以提高数据插入速度(效率提升不明显)的更多相关文章

  1. jdbc 01: 连接mysql,并实现数据插入

    jdbc连接mysql,并实现数据插入 package com.examples.jdbc.o1_连接与插入; import java.sql.*; /* jdbc数据库连接六步 */ public ...

  2. php中bindValue的批量提交sql语句

    php预编译sql语句,可以批量提交sql,也可以实现防注入 <?php $dsn='mysql:host=127.0.0.1;port=3306;dbname=bisai'; $usernam ...

  3. 将Sql查询语句获取的数据插入到List列表里面

    Sql查询语句获取的数据是分格式的,我们还用SqlDataReader来做,然后用IDataReader来接收读取,以下是代码: //我想查询一个用户表的信息,该用户有姓名,密码,信息三列 //1.定 ...

  4. PostgresSQL使用Copy命令能大大提高数据导入速度

    最近在做会员系统,其中会员系统有一份企业信息初始化的数据,需要从SQL Server数据库导入到PostgreSQL,单表的数据近30万.最开始的方案是在SQL Server上生成insert int ...

  5. Javascript高性能编程-提高数据访问速度

         hasOwnProperty()仅检索实例不检索原型,in即检索实例,又检索原型      成员嵌套越深,访问速度越慢,只在必要的情况下使用对象成员.      如果在同一个函数中你要多次读 ...

  6. 执行插入语句时直接返回插入信息的自增id,判断是否为空

    insert into userinfo(UserName,UserPass,RegTime,email)values('a','b',GETDATE(),'123@qq.com');select @ ...

  7. 将EXCEL中的列拼接成SQL insert插入语句

    工作中经常需要将EXCEL文件中的数据导入到各种数据库,但是对于不熟悉数据库的人来说,如果直接使用命令执行导入,这无疑是一个难题,也是一个风险.这里我们直接在EXCEL文件中拼接成标准的SQL ins ...

  8. 解决 C++ 操作 MySQL 大量数据插入效率低下问题

    往 Mysql 中,插入10000条简单数据.速度很缓慢,竟然要5分钟左右, 可是打开事务的话.一秒不到就搞定了 代码: #include <iostream> #include < ...

  9. MySQL:JDBC批量插入数据的效率

    平时使用mysql插入.查询数据都没有注意过效率,今天在for循环中使用JDBC插入1000条数据居然等待了一会儿 就来探索一下JDBC的批量插入语句对效率的提高 首先进行建表 create tabl ...

随机推荐

  1. UART串口简介

    通用异步收发传输器(Universal Asynchronous Receiver Transmitter) 原理 发送数据时,CPU将并行数据写入UART,UART按照一定的格式在一根电线上串行发出 ...

  2. Delphi 从一个对象中继承数据和方法

  3. Linux学习笔记(一)分区

    一.硬件设备文件名 二.设备文件名 /dev/hda1(IDE硬盘接口) /dev/sda1(SCSI硬盘接口.SATA硬盘接口) 其中,a代表第1个硬盘(以此类推,b为第2个硬盘),1代表第1个分区 ...

  4. linux——实际工作中如何使用linux

    实际工作中,linux系统都不会在我们自己的电脑上,linux系统安装在机房的服务器上,我们操作linux不可能跑到机房去,所以我们需要有一个工具,能在公司通过网络远程连接到机房的linux服务器上 ...

  5. anaconda环境中---py2.7下安装tf1.0 + py3.5下安装tf1.5

    anaconda环境中---py2.7下安装tf1.0 + py3.5下安装tf1.5 @wp20181030 环境:ubuntu18.04, anaconda2, ubuntu系统下事先安装了pyt ...

  6. 关于Linux连接工具mobaxterm显示中文乱码问题

    本人用的是MobaXterm Personal 9.1版本.近期发现连接上服务器,查看日志时,发现中文乱码,无法正常显示.甚是苦恼.百度搜索该工具显示乱码问题,无一人解决.提倡更换连接工具.无意间发现 ...

  7. 使用pipenv管理你的python项目

    怎么使用pipenv管理你的python项目   原文链接:https://robots.thoughtbot.com/how-to-manage-your-python-projects-with- ...

  8. django-session的使用---数据库,缓存型

    Django中默认支持Session,其内部提供了5种类型的Session供开发者使用: 数据库(默认) 缓存 文件 缓存+数据库 加密cookie 1.数据库Session Django默认支持Se ...

  9. ACM-ICPC 2018 青岛赛区网络预赛 J. Press the Button(数学)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4056 题意:有一个按钮,时间倒计器和计数器,在时间[0,t]内, ...

  10. 洛谷P1052 过河【线性dp】【离散化】

    题目:https://www.luogu.org/problemnew/show/P1052 题意: 青蛙要从0跳到超过$l$的地方,每一次可以跳$s$到$t$之间的任意数. 在河中有m个石头,要求在 ...