批量插入

批量执行 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. CSS基础-层叠与继承

    继承 一些属性可以被继承,一些不可以. 一般来说,字体颜色.字体大小会被继承,关于形状的如 padding .border .margin.width等就不会被继承.哪些属性属于默认继承很大程度上是由 ...

  2. luogu P6835 概率DP 期望

    luogu P6835 概率DP 期望 洛谷 P6835 原题链接 题意 n + 1个节点,第i个节点都有指向i + 1的一条单向路,现在给他们添加m条边,每条边都从一个节点指向小于等于自己的一个节点 ...

  3. C++ 纯虚函数与抽象类——virtual 和纯说明符 “=0”

    什么时候使用纯虚函数 某些类,在现实角度和项目角度都不需要实例化(不需要创建它的对象),这个类中定义的某些成员函数只是为了提供一个形式上的接口,准备上子类来做具体的实现.此时这个方法就可以定义为&qu ...

  4. sqli-labs less-24(二次注入)

    less-24 原理: 在网站处理用户提交的数据的时候,只是将某些敏感字符进行了转义.因而使得用户第一次提交的时候不会被当做代码执行.但是这些数据存入数据库的时候却没有转义,而网站程序默认数据库中的数 ...

  5. 【转载】Django,学习笔记

    [转自]https://www.cnblogs.com/jinbchen/p/11133225.html Django知识笔记   基本应用 创建项目: django-admin startproje ...

  6. 容器编排系统之Pod生命周期、健康/就绪状态探测以及资源限制

    前文我们了解了在k8s上的资源标签.标签选择器以及资源注解相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/14141080.html:今天我们来聊下k8 ...

  7. MySQL-常见小疑惑

    1. DISTINCT 多列去重 1.1 select DISTINCT a,b 实际含义是? 正确:排除 (a列重复且b列重复)的记录  错误:排除 a b两列 值合并后 重复的记录. 举例1: 去 ...

  8. [日常摸鱼]HDU1724 Ellipse-自适应Simpson法

    模板题~ QAQ话说Simpson法的原理我还是不太懂-如果有懂的dalao麻烦告诉我~ 题意:每次给一个椭圆的标准方程,求夹在直线$x=l$和$x=r$之间的面积 Simpson法 (好像有时候也被 ...

  9. [日常摸鱼]luogu1613跑路

    新年A的第一道题2333 https://www.luogu.org/problemnew/show/P1613 题意:给一张有向图,每条边长为1,每个单位时间只能走$2^k$的长度,$k$可以任意选 ...

  10. babel 与 ast

    什么是 babel Babel 是一个工具链,主要用于将 ECMAScript 2015+ 版本的代码转换为向后兼容的 JavaScript 语法,以便能够运行在当前和旧版本的浏览器或其他环境中. 什 ...