批量插入

批量执行 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. Raft概述

    Raft 1. 概述 Raft是一种一致性(共识)算法,相比Paxos,Raft更容易理解和实现,它将分布式一致性问题分解成多个子问题,Leader选举(Leader election).日志复制(L ...

  2. 矩阵乘法优化DP复习

    前言 最近做毒瘤做多了--联赛难度的东西也该复习复习了. Warning:本文较长,难度分界线在"中场休息"部分,如果只想看普及难度的可以从第五部分直接到注意事项qwq 文中用(比 ...

  3. CF1457D XOR-gun

    这道题真的把我秀到了,我首先猜了一波结论,打了一个可持久化 \(\text{Trie}\) 加二分的两只 \(\log_2\) 的做法,发现不能 \(PP\) ,然后就一直改到比赛结束还没改过. 然后 ...

  4. 【NOI2019】弹跳(KDT优化建图)

    Description 平面上有 \(n\) 个点,分布在 \(w \times h\) 的网格上.有 \(m\) 个弹跳装置,由一个六元组描述.第 \(i\) 个装置有参数:\((p_i, t_i, ...

  5. sort by背后使用了什么排序算法

    用到了快速排序,但不仅仅只用了快速排序,还结合了插入排序和堆排序 搬运自https://blog.csdn.net/qq_35440678/article/details/80147601

  6. git学习——git命令之创建版本库和版本退回

    原文来至 一.创建版本库 版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改.删除,Git都能跟踪,以便任何时刻都可以追 ...

  7. 一、java多线程编程核心技术之(笔记)——多线程的实现

    概念:可以理解为在进程中独立运行的子任务.比如,QQ.exe在运行时就有很多子任务在运行,好友视屏线程,下载文件线程,传输数据线程等等. 优点:1.提升CPU资源利用率,提升系统性能. 一.多线程的实 ...

  8. block、inline、inline-block区别以及标签嵌套

    1.block 将元素转为块元素,块元素占一行,可以设置宽和高. 2.inline 将元素转为行内元素,占一行,不可以设置宽和高. 3.inline-block 将元素设置为行内块元素,这时元素既可以 ...

  9. Jenkins的war包安装

    安装Jenkins首先要安装jdk,在官网下载jdk安装并配置环境变量 1.Jenkins下载地址,下载war包 https://www.jenkins.io/download/ 2.打开命令行窗口, ...

  10. Happens-Before原则到底规定了什么

    Happens-Before 规则 如何理解 Happens-Before 呢?如果望文生义(很多网文也都爱按字面意思翻译成"先行发生"),那就南辕北辙了,Happens-Befo ...