批量插入

批量执行 SQL 语句

当需要成批插入或者更新记录时,可以采用 Java 的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理。通常情况下比单独提交处理更有效率。

JDBC 的批量处理语句包括下面三个方法:

  • addBatch(String):添加需要批量处理的 SQL 语句或是参数;
  • executeBatch():执行批量处理语句;
  • clearBatch():清空缓存的数据。

通常会遇到两种批量执行 SQL 语句的情况:

  • 多条 SQL 语句的批量处理;
  • 一个 SQL 语句的批量传参。

高效的批量插入

package cn.parzulpan.jdbc.ch05;

import cn.parzulpan.jdbc.util.JDBCUtils;
import org.junit.Test; import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.Statement; /**
* @Author : parzulpan
* @Time : 2020-12-01
* @Desc : 批量插入
*/ public class BulkInsertTest { // 实现方式一:使用 Statement
@Test
public void test1() throws Exception {
long start = System.currentTimeMillis(); Connection connection = JDBCUtils.getConnection();
Statement statement = connection.createStatement();
for (int i = 0; i < 1000; i++) {
String sql = "insert into goods(name)values('name_" + i + "')";
statement.executeUpdate(sql);
} JDBCUtils.closeResource(connection, statement); long end = System.currentTimeMillis();
System.out.println(end - start); // 1000 -> 131751ms
} // 实现方式二:使用 PrepareStatement
@Test
public void test2() throws Exception {
long start = System.currentTimeMillis(); Connection connection = JDBCUtils.getConnection();
String sql = "insert into goods(name)values(?)";
PreparedStatement statement = connection.prepareStatement(sql);
for (int i = 0; i < 1000; i++) {
statement.setString(1, "name_" + i);
statement.executeUpdate();
} JDBCUtils.closeResource(connection, statement); long end = System.currentTimeMillis();
System.out.println(end - start); // 1000 -> 122340ms
} // 实现方式三:使用 批量处理语句
// mysql 服务器默认是关闭批处理的,需要通过一个参数,让 mysql 开启批处理的支持。
// ?rewriteBatchedStatements=true 写在配置文件的 url 后面
@Test
public void test3() throws Exception {
long start = System.currentTimeMillis(); Connection connection = JDBCUtils.getConnection();
String sql = "insert into goods(name)values(?)";
PreparedStatement statement = connection.prepareStatement(sql);
for (int i = 0; i < 1000; i++) {
statement.setString(1, "name_" + i); // 1. "攒" sql
statement.addBatch();
if (i % 500 == 0) {
// 2. 执行
statement.executeBatch();
// 3. 清空
statement.clearBatch();
}
} JDBCUtils.closeResource(connection, statement); long end = System.currentTimeMillis();
System.out.println(end - start); // 1000 -> 69084ms
} // 实现方式四:设置为不自动提交数据
@Test
public void test4() throws Exception {
long start = System.currentTimeMillis(); Connection connection = JDBCUtils.getConnection(); // 1. 设置为不自动提交数据
connection.setAutoCommit(false);
String sql = "insert into goods(name)values(?)";
PreparedStatement statement = connection.prepareStatement(sql);
for (int i = 0; i < 1000; i++) {
statement.setString(1, "name_" + i); // 1. "攒" sql
statement.addBatch();
if (i % 500 == 0) {
// 2. 执行
statement.executeBatch();
// 3. 清空
statement.clearBatch();
}
} // 2. 提交数据
connection.commit(); JDBCUtils.closeResource(connection, statement); long end = System.currentTimeMillis();
System.out.println(end - start); // 1000 -> 1338ms }
}

推荐使用方式四。

练习和总结

【JDBC核心】批量插入的更多相关文章

  1. JDBC的批量插入操作

    在今天之前,当我遇到需要使用JDBC对数据库进行批量插入操作的时候,我使用的方法如下: ①使用Connection建立数据库连接: ②使用PreparedStatement提交SQL语句,将数据插入: ...

  2. JDBC的批量批量插入

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

  3. jdbc批量插入

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

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

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

  5. Hibernate的批量插入(&&JDBC)

    来自: http://blog.csdn.net/an_2016/article/details/51759890 一.批量插入(两种方式) 1,通过hibernate缓存 如果这样写代码进行批量插入 ...

  6. JDBC中的批量插入和乱码解决

    字符集-乱码问题 用JDBC访问MySql数据库的时候,如果JDBC使用的字符集和MySql使用的字符集不一致,那么会导致乱码发生.解决办法当时是在使用JDBC的时候指定和数据库一样的字符集.我们可以 ...

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

    JDBC批量插入主要用于数据导入和日志记录因为日志一般都是先写在文件下的等. 我用Mysql 5.1.5的JDBC driver 分别对三种比较常用的方法做了测试 方法一,使用PreparedStat ...

  8. JDBC批量插入数据效率分析

    对于需要批量插入数据库操作JDBC有多重方式,本利从三个角度对Statement和PreparedStatement两种执行方式进行分析,总结较优的方案. 当前实现由如下条件: 执行数据库:Mysql ...

  9. JDBC批量插入优化addbatch

    // 获取要设置的Arp基准的List后,插入Arp基准表中 public boolean insertArpStandardList(List<ArpTable> list) { Con ...

随机推荐

  1. 开源性能监控分析工具glowroot

    最近在做java性能瓶颈定位分析工具的研究,发现glowroot工具是一款相当不错的APM工具(Wonderful tool),架构简洁,部署简单,上手容易. 经过亲身搭建体验,总结了产品的架构,工具 ...

  2. CentOS 用户请关注,你期待的 CentOS Linux 9 再也不会来了

    2020年12月晚上红帽官网发布了一条公告,宣布了几件事情: 将不会发行 CentOS Linux 9 CentOS Linux 8 的更新支持持续到2021年12月31日 CentOS Linux ...

  3. NOI Online #2 提高组 游戏

    没用二项式反演的菜比. 题目链接 Solution 非平局代表的树上祖先关系是比较好统计,(可以在处理一个点时,考虑用他去匹配他的子树中的东西)而平局的关系比较难统计.我们不妨求出至少 \(k\) 个 ...

  4. OI知识点/得分技巧的归纳总结

    网络流 拆点/拆边技巧 题目来源 bzoj1070 题目描述 同一时刻有\(N\)位车主带着他们的爱车来到了汽车维修中心.维修中心共有\(M\)位技术人员,不同的技术人员对不同 的车进行维修所用的时间 ...

  5. mongodb 学习之——mongod --help 中文解释

    中文解释如下: -------------------------------------------------------------------------------- --quiet # 安 ...

  6. 自定义3D地图

    基于echarts的3D地图进行,直接将这代码粘贴到echarts的demo中即可呈现效果 var mygeo = { // 标准的geojson格式 "type": " ...

  7. STL——容器(Map & multimap)的拷贝构造与赋值

    1. Map & multimap 的拷贝构造与赋值 map(const map &mp);               //拷贝构造函数 map& operator=(con ...

  8. Hadoop框架:Yarn基本结构和运行原理

    本文源码:GitHub·点这里 || GitEE·点这里 一.Yarn基本结构 Hadoop三大核心组件:分布式文件系统HDFS.分布式计算框架MapReduce,分布式集群资源调度框架Yarn.Ya ...

  9. Acunetix 11手动导入Burp suite抓取的网页

    设置爬取 因为Burp的代理默认配置拦截所有请求,需要先来关闭这个功能,在Proxy标签页面中,选择Intercept子标签页面,点击 Intercept is on按钮. 使用配置好代理服务器的浏览 ...

  10. 任务队列--nodejs

    很多项目可能都会涉及到任务队列来进行任务处理和维护的,那么需要使用到redis或者第三方库(使用redis)来实现任务队列,甚至需要控制并发量,但是对于saas部署来说使用redis可能会比较麻烦和成 ...