// 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. 6.单表的CRUD操作

    1.插入后用新id初始化被插入对象 <insert id="insertStudentCatchId"> insert into student (age,name,s ...

  2. LeetCode 滑动窗口题型整理

    一.滑动窗口题型模板 /* * 滑动窗口类型: 模板 */ public List<Integer> slideWindowMode(String s, String t) { // 1 ...

  3. mysql启动失败“MySQL Daemon failed to start”

    CentOS上,用命令:service mysqld restart 启动mysql报错: # service mysqld restart Stopping mysqld: [ OK ] MySQL ...

  4. list 列表 函数的引用

    方法 意义 L.index(v [, begin[, end]]) 返回对应元素的索引下标, begin为开始索引,end为结束索引,当 value 不存在时触发ValueError错误 L.inse ...

  5. pytorch转onnx问题

    Fail to export the model in PyTorch https://github.com/onnx/tutorials/blob/master/tutorials/PytorchA ...

  6. Dart的导包

    Dart中的库主要有三种: 1.我们自定义的库 import 'lib/xxx.dart'; 2.系统内置库 import 'dart:math'; import 'dart:io'; import ...

  7. 11_Hive TransForm 案例

    1.需求:将Json格式的数据处理后插入新表中 数据文件如下:rating.json,文件格式:{"movie":"2858","rate" ...

  8. Collection 和 Collections 有什么区别?(未完成)

    Collection 和 Collections 有什么区别?(未完成)

  9. JavaScript程序设计——FOR循环

    FOR循环流程图: 1.编写求6!的阶乘的代码 2.编写10个10相加的和 3.编写1+2+3+...+10连续相加的和 4.编写1+(1+2)+(1+2+3)+...+(1+2+3+...+10)连 ...

  10. 如何复制word的图文到ueditor中自动上传?

    官网地址http://ueditor.baidu.com Git 地址 https://github.com/fex-team/ueditor 参考博客地址 http://blog.ncmem.com ...