在今天之前,当我遇到需要使用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. 【LOJ】#2174. 「FJOI2016」神秘数

    题解 这道题的结论很显然= = 就是暴力求的话,把一个区间的数排一下序,如果当前这个数大于前面所有数的前缀和+1,那么前缀和+1即我们所求的答案 那么我们设置一个当前答案(初始为1),在主席树上求出来 ...

  2. nodejs pm2配置使用教程

    pm2是非常优秀工具,它提供对基于node.js的项目运行托管服务.它基于命令行界面,提供很多特性: 内置的负载均衡器等等,下面我们就一起来看看吧. 一.简介 pm2是一个带有负载均衡功能的应用进程管 ...

  3. 洛谷P2231 [HNOI2002]跳蚤 [数论,容斥原理]

    题目传送门 跳蚤 题目描述 Z城市居住着很多只跳蚤.在Z城市周六生活频道有一个娱乐节目.一只跳蚤将被请上一个高空钢丝的正中央.钢丝很长,可以看作是无限长.节目主持人会给该跳蚤发一张卡片.卡片上写有N+ ...

  4. UWP数据分享

    前言 本文介绍如何在通用Windows平台(UWP)应用程序中支持共享合同.共享合同是一种在应用程序之间快速共享数据(如文本,链接,照片和视频)的简便方法.例如,用户可能想要使用社交网络应用与他们的朋 ...

  5. 【Python初级】由生成杨辉三角代码所思考的一些问题

    杨辉三角定义如下: 1 / \ 1 1 / \ / \ 1 2 1 / \ / \ / \ 1 3 3 1 / \ / \ / \ / \ 1 4 6 4 1 / \ / \ / \ / \ / \ ...

  6. Mybatis源码分析之Mapper文件解析

    感觉CSDN对markdown的支持不够友好,总是伴随各种问题,很恼火! xxMapper.xml的解析主要由XMLMapperBuilder类完成,parse方法来完成解析: public void ...

  7. 最大流 [USACO4.2]草地排水Drainage Ditches

    Background 在农夫约翰的农场上,每逢下雨,贝茜最喜欢的三叶草地就积聚了一潭水.这意味着草地被水淹没了,并且小草要继续生长还要花相当长一段时间.因此,农夫约翰修建了一套排水系统来使贝茜的草地免 ...

  8. 切换java版本

    First, clean your project: Project > Clean If that doesn't fix things... Second check your projec ...

  9. FastReport.Net使用:[27]样式使用

    样式设置与使用 1.打开样式设置界面,通过 报表->样式 来打开. 2.样式设置包含:边框,填充,字体和文本颜色.假如不需要某项设置,可将其选择框去掉. 3.设置好样式后,将标题的style设置 ...

  10. Codeforces 160 D. Edges in MST

    \(>Codeforces \space 160 D. Edges in MST<\) 题目大意 : 给出一张带权无向图,求对于这张图上的每一条边,其是必然存在于每一种最小生成树中,还是至 ...