在今天之前,当我遇到需要使用JDBC对数据库进行批量插入操作的时候,我使用的方法如下:

①使用Connection建立数据库连接;

②使用PreparedStatement提交SQL语句,将数据插入;

③关闭数据库连接,释放资源。

但是今晚,我遇到一个问题,需要对MySQL数据库批量插入10000条记录,于是,我将插入操作封装成了一个方法,然后调用,没插入一条记录,都要打开、关闭一次数据库,结果就是,等着一万条记录插入数据库之后,时间居然用了6分半钟。这是不能容忍的,用户不能等待这么久的时间。于是我就寻找JDBC批量插入的方法,参考了一篇博文,地址如下:

三种JDBC批量插入编程方法的比较

下面贴出一种方法,并作简要的说明。

public void batchInsert() {
Connection conn = DatabaseUtil.getConnection();
PreparedStatement prest = null;
try {
conn.setAutoCommit(false);
String sql = "insert into test values(?,?,?,?,?,?)";
prest = conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
for (int i = 0; i < 10000; i++) {
prest.setInt(1, 1);
prest.setInt(2, 2);
prest.setInt(3, 3);
prest.setInt(4, 4);
prest.setInt(5, 5);
prest.setInt(6, 6);
prest.addBatch();
}
prest.executeBatch();
conn.commit();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
DatabaseUtil.close(null, prest, conn);
}
}

说明下在建Statement的时候,后面两个参数的意义: 
第一个参数指定 ResultSet 的类型。其选项有: 

TYPE_FORWARD_ONLY:缺省类型。只允许向前访问一次,并且不会受到其他用户对该数据库所作更改的影响。 

TYPE_SCROLL_INSENSITIVE:允许在列表中向前或向后移动,甚至可以进行特定定位,例如移至列表中的第四个记录或者从当前位置向后移动两个记录。不会受到其他用户对该数据库所作更改的影响。 

TYPE_SCROLL_SENSITIVE:象 TYPE_SCROLL_INSENSITIVE 一样,允许在记录中定位。这种类型受到其他用户所作更改的影响。如果用户在执行完查询之后删除一个记录,那个记录将从 ResultSet 中消失。类似的,对数据值的更改也将反映在 ResultSet 中。 

第二个参数设置 ResultSet 的并发性,该参数确定是否可以更新 ResultSet。其选项有: 

CONCUR_READ_ONLY:这是缺省值,指定不可以更新 

ResultSet CONCUR_UPDATABLE:指定可以更新 ResultSet

需要说明的一点是,使用批量插入之前,请将JDBC的自动提交取消:

conn.setAutoCommit(false);

使用JDBC的批量提交,速度很快,同样是插入10000条记录,时间只用了1.7s

下面是使用Statement的批量插入:

public void batchInsert() {
Connection conn = DatabaseUtil.getConnection();
Statement stmt = null;
try {
conn.setAutoCommit(false);
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
for(int i = 0; i < 10000; i++){
stmt.addBatch("INSERT INTO test VALUES(1,2,3,4,5,6)");
}
stmt.executeBatch();
conn.commit();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{ // TODO Auto-generated catch block
e.printStackTrace();
DatabaseUtil.close(null, stmt, conn);
}
}

JDBC的批量插入操作的更多相关文章

  1. Mybatis对oracle数据库进行foreach批量插入操作

    MySQL支持的语法 INSERT INTO `tableX` ( `a`, `b`, `c`, `d`, `e` ) VALUES <foreach collection ="lis ...

  2. SQLServer分页查询方法整理以及批量插入操作SqlBulkCopy

    分页查询 通用方法:sqlserver 2005 + ROW_NUMBER() OVER()方式: ; TOP NOT IN方式 : ID FROM TripDetail ORDER BY ID) O ...

  3. 各种数据库的批量插入操作_Oracle

    最近工作中需要优化以前各种的Excel批量导入功能,目前将能优化的方面做个记录. 选用技术: 目前.Net可以访问Oracle常用的Dll,有三种: 微软自带的 System.Data.OracleC ...

  4. MyBatis注解方式批量插入操作

    @Insert({ "<script>", "insert into table_name(column1, column2, column3) values ...

  5. Mybatis与JDBC批量插入MySQL数据库性能测试及解决方案

    转自http://www.cnblogs.com/fnz0/p/5713102.html 不知道自己什么时候才有这种钻研精神- -. 1      背景 系统中需要批量生成单据数据到数据库表,所以采用 ...

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

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

  7. JDBC的批量批量插入

    本文部分转载于:http://blog.itpub.net/29254281/viewspace-1151785/ http://www.cnblogs.com/chenjianjx/archive/ ...

  8. jdbc批量插入

    分享牛,分享牛原创.有这样一个需求,文本文件中的数据批量的插入mysql,怎么用jdbc方式批量插入呢? jdbc默认提供了批量插入的方法,可能用一次就忘记了,这里做笔记记录一下jdbc批量插入吧. ...

  9. Java豆瓣电影爬虫——减少与数据库交互实现批量插入

    节前一个误操作把mysql中record表和movie表都清空了,显然我是没有做什么mysql备份的.所以,索性我把所有的表数据都清空的,一夜回到解放前…… 项目地址:https://github.c ...

随机推荐

  1. TCP和UDP发送数据包的大小问题

    用UDP协议发送时,用sendto函数最大能发送数据的长度为:65535-20-8=65507字节,其中20字节为IP包头长度,8字节为UDP包头长度.用sendto函数发送数据时,如果指的的数据长度 ...

  2. C# 6.0 新特性 (四)

    原文: 1.http://www.cnblogs.com/BoyceYang/p/3711343.html 2.http://www.cnblogs.com/lhking/p/3660182.html ...

  3. js红包算法【转载】

    源文地址:https://juejin.im/post/5ae413946fb9a07a9c03f7f7 <!DOCTYPE html> <html lang="en&qu ...

  4. jquery 美化弹出提示 漂亮的Dialog 对话框

    三个不同的效果,分别是普通的警告,确认/取消,带一个输入框 本例用了jquery.alertify.js,请到演示页面查看 css文件也请到演示页面查看 JavaScript Code <scr ...

  5. Linux与其它类Unix内核的比较

    单块结构的内核:由几个逻辑上独立的成分构成,单块结构,大多数据商用Unix变体也是单块结构: 编译并静态连接的传统Unix内核:Linux能自动按需动态地装载和卸载部分内核代码(模块),而传统Unix ...

  6. Shiro切入Spring的方式

    在springMVC中要使用shiro,一般都遵循下面的配置: applicationContext-shiro.xml <bean id="shiroFilter" cla ...

  7. 【Leetcode】583. Delete Operation for Two Strings

    583. Delete Operation for Two Strings Given two words word1 and word2, find the minimum number of st ...

  8. debug id

    id是Eclipse的debugger自己生成的,用于告诉你哪些变量是指向同一个对象:id相同即指向同一个对象. primitive不是对象,所以就没有id. 但是如果你用primitive的wrap ...

  9. RxSwift 系列(三)

    RxSwift 系列(三) -- Combination Operators 前言 本篇文章将要学习如何将多个Observables组合成一个Observable.Combination Operat ...

  10. 【BZOJ 3238】 3238: [Ahoi2013]差异(SAM)

    3238: [Ahoi2013]差异 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 3047  Solved: 1375 Description In ...