// 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. C#面向对象 (访问修饰符、封装、继承、多态)

    先看一下创建一个新项目时的基本格式 using System; using System.Collections.Generic; using System.Linq; //引用的命名空间 using ...

  2. 第二章、Django以及数据库的配置

    目录 第二章.Django以及数据库的配置 一.小白必会三板斧 二.静态文件配置 三.form表单 action和method参数可以写的形式 四.request对象及方法 五.django连接数据库 ...

  3. 浅谈nginx简介和应用场景

    简介 nginx是一款轻量级的web服务器,它是由俄罗斯的程序设计师伊戈尔·西索夫所开发. nginx相比于Tomcat性能十分优秀,能够支撑5w的并发连接(而Tomcat只能支撑200-400),并 ...

  4. Hadoop_23_MapReduce倒排索引实现

    1.1.倒排索引  根据属性的值来查找记录.这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址.由于不是由记录来确 定属性值,而是由属性值来确定记录的位置,因而称为倒排索引(invert ...

  5. Make It Connected CodeForces - 1095F (建图+最小生成树)

    Make It Connected CodeForces - 1095F You are given an undirected graph consisting of nn vertices. A ...

  6. Paper Reading:Deep Neural Networks for Object Detection

    发表时间:2013 发表作者:(Google)Szegedy C, Toshev A, Erhan D 发表刊物/会议:Advances in Neural Information Processin ...

  7. okhttp缓存策略源码分析:put&get方法

    对于OkHttp的缓存策略其实就是在下一次请求的时候能节省更加的时间,从而可以更快的展示出数据,那在Okhttp如何使用缓存呢?其实很简单,如下: 配置一个Cache既可,其中接收两个参数:一个是缓存 ...

  8. JDK的收费问题

    关于JDK是否收费,我也有过疑问,查了一些资料,就在这里做一个简要的说明. 首先要明白JDK的发布模型.两年多以前,2017年9月21日,伴随着JDK9的发布,JDK就开启了新的发布模式(如下图所示) ...

  9. python+Appium自动化:H5元素定位

    问题思考 在混合开发的App中,经常会有内嵌的H5页面.那么这些H5页面元素该如何进行定位操作呢? 解决思路 针对这种场景直接使用前面所讲的方法来进行定位是行不通的,因为前面的都是基于Andriod原 ...

  10. setTimeout,promise,promise.then, async,await执行顺序问题

    今天下午看了好多关于这些执行顺序的问题  经过自己的实践 终于理解了  记录一下就拿网上出现频繁的代码来说: async function async1() { console.log('async1 ...