jdbc批量插入实现大批量数据快速插入

今天在做一个将excel数据导入数据库的程序时,由于数据量大,准备采用jdbc的批量插入。于是用了preparedStatement.addBatch();当加入1w条数据时,再执行插入操作,preparedStatement.executeBatch()。我原以为这样会很快,结果插入65536条数据一共花30多分钟,完全出乎我的意料。于是问了一下同事,他们在处理这种大批量数据导入的时候是如何处理的,发现他们也是用的jdbc批量插入处理,但与我不同是:他们使用了con.setAutoCommit(false);然后再preparedStatement.executeBatch()之后,再执行con.commit();于是再试,什么叫奇迹?就是刚刚导入这些数据花了半小时,而加了这两句话之后,现在只用了15秒钟就完成了。于是去查查了原因,在网上发现了如下一段说明:

* When importing data into InnoDB, make sure that MySQL does not have autocommit mode enabled because that

requires a log flush to disk for every insert. To disable autocommit during your import operation, surround it with

SET autocommit and COMMIT statements:

SET autocommit=0;
     ... SQL import statements ...
     COMMIT;

第一次,正是因为没有setAutoCommit(false);那么对于每一条insert语句,都会产生一条log写入磁盘,所以虽然设置了批量插入,但其效果就像单条插入一样,导致插入速度十分缓慢。

部分代码如下:

String sql = "insert into table *****";
con.setAutoCommit(false);
ps = con.prepareStatement(sql);
for(int i=1; i<65536; i++){
    ps.addBatch();
    // 1w条记录插入一次
    if (i % 10000 == 0){
         ps.executeBatch();
         con.commit();
     }
}
// 最后插入不足1w条的数据
ps.executeBatch();
con.commit();
时间: 2024-10-29 19:10:33

jdbc批量插入实现大批量数据快速插入的相关文章

大量数据快速插入方法探究[nologging+parallel+append]

大量数据快速插入方法探究 快速插入千万级别的数据,无非就是nologging+parallel+append. 1     环境搭建 构建一个千万级别的源表,向一个空表insert操作. 参考指标:insert动作完成的实际时间. SQL> drop table test_emp cascadeconstraints purge; Table dropped. SQL> create table test_emp as select *from emp; Table created. SQL&

大批量数据的插入优化的小细节

今天在测试将elasticsearch中的20万条数据迁移到MySQL中时,总感觉速度比较慢,尝试了好多方法,比如网上都说的: public void batchSave(List<MailDeliveryTask> tasks) { Session session = sessionFactory.openSession(); for (MailDeliveryTask task : tasks) { session.save(task); } session.flush(); sessio

JDBC批量插入数据优化,使用addBatch和executeBatch

>>.在之前的玩转JDBC打造数据库操作万能工具类JDBCUtil,加入了高效的数据库连接池,利用了参数绑定有效防止SQL注入中其实忽略了一点,那就是SQL的批量插入的问题,如果来个for循环,执行上万次,肯定会很慢,那么,如何去优化呢? https://www.awaimai.com/841.html 一.用 preparedStatement.addBatch()配合preparedStatement.executeBatch()去批量插入 1 /** 2 * 执行数据库插入操作 4 *

SQL Server 2012中快速插入批量数据的示例及疑惑

SQL Server 2008中SQL应用系列--目录索引 今天在做一个案例演示时,在SQL Server 2012中使用Insert语句插入1万条数据,结果遇到了一个奇怪的现象,现将过程分享出来,以供有兴趣的同学参考. 附:我的测试环境为:SQL Server 2012,命名实例 Microsoft SQL Server 2012 - 11.0.2100.60 (Intel X86) Feb 10 2012 19:13:17 Copyright (c) Microsoft Corporatio

35 JDBC批量插入数据二

package MYSQK; import java.sql.*; /** * PreparedStatement 对象可以对sql语句进行预编译,预编译的信息会存在存储该对象中,当相同的sql语句再次执行时,程序 * 会使用PrepareStatement对象中,而不需再次编译去查询数据库,大大提高了数据的访问效率 */ public class Insert { public static void main(String[] args) throws SQLException{ Conne

JDBC实现往MySQL插入百万级数据

from:http://www.cnblogs.com/fnz0/p/5713102.html JDBC实现往MySQL插入百万级数据 想往某个表中插入几百万条数据做下测试, 原先的想法,直接写个循环10W次随便插入点数据试试吧,好吧,我真的很天真.... DROP PROCEDURE IF EXISTS proc_initData;--如果存在此存储过程则删掉 DELIMITER $ CREATE PROCEDURE proc_initData() BEGIN DECLARE i INT DE

MySql快速插入以及批量更新

插入: MySql提供了可以一次插入多条数据的用法: [sql] INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9),(10,11,12)...;  在程序中可以通过循环,添加Values对应的列表,最后使用一次executeUpdate完成插入操作.但是Mysql语句并不是越长越好,MYsql语句长度有限制,可以查看mysql的配置文件my.in中max_allowed_packet属性,并进行相应设置. 更新: Mysql中没

MYSQL 大批量数据插入

最近在做MYSQL大批量数据的测试,就简单总结一下遇到的问题: 首先我是简单的写了一个MYSQL的循环插入数据的SP,具体如下: 这是插入100W数据的过程和结果,可以看到是换了55min +20S约3320秒(约300rows/s),看到之后我是只崩溃,就在网上查了些提速的方法: 0. 最快的当然是直接 copy 数据库表的数据文件(版本和平台最好要相同或相似): 1. 设置 innodb_flush_log_at_trx_commit = 0 ,相对于 innodb_flush_log_at

jdbc:mysql和oracle插入一条数据返回主键

package org.sin.common.dao; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import or