批量插入

批量执行 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. 微软面试题:剑指 Offer 51. 数组中的逆序对 Hard 出现次数:3

    题目描述: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对. 输入一个数组,求出这个数组中的逆序对的总数. 示例 1: 输入: [7,5,6,4] 输出: 5 限制: ...

  2. 如何建一个SAM

    部分改编自OI WIKI 先从一个简单的问题入手: 给定一个串,构造一个图,使其能够表示它的所有子串. 显然一个子串就是一个后缀的前缀.所以一个很显然的方式就是把所有后缀扔进trie里. 比如当前串是 ...

  3. P5327 [ZJOI2019]语言

    一边写草稿一边做题吧.要看题解的往下翻,或者是旁边的导航跳一下. 草稿 因为可以开展贸易活动的条件是存在一种通用语 \(L\) 满足 \(u_i\) 到 \(v_i\) 的最短路径上都会 \(L\) ...

  4. tensorflow学习笔记——DenseNet

    完整代码及其数据,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/DeepLearningNote 这里结合网络的资料和De ...

  5. Linux shell 获取目录下时间最新的文件的文件名

    ls -lt /dirname/ | grep filename | head -n 1 |awk '{print $9}' 逐条解释: ls -lt /dirname/ 列出此目录下的所有文件并按照 ...

  6. mysql 查询 添加 删除 语句

    1.说明:创建数据库CREATE DATABASE database-name2.说明:删除数据库drop database dbname3.说明:备份sql server--- 创建 备份数据的 d ...

  7. Unity GameObject

    GameObject 游戏对象 GameObject是unity所有实体的基类 gameObject 获取当前脚本所挂载的游戏对象 一般来说,在属性视图中能看到或修改的属性,我们同样可以在脚本中获取并 ...

  8. Java CPU占用过高之诊断

    Redhat, java 先用top 命令(默认为cpu占用排序), 确认java占用CPU kill -3 <java pid> ps Hh -eo pid,tid,pcpu | sor ...

  9. 跟我一起学Redis之高可用从主从复制开始

    前言 现在遇到高并发场景时,缓存技术应该算是性能优化的第一步,缓解数据库压力的同时还能提高访问效率,而Redis应该是绝大多数应用场景的首选.但是尽快Redis性能再优秀,在当今高并发场景下,一台服务 ...

  10. DRF使用超链接API实现真正RESTful

    很多API并不是真正的实现了RESTful,而应该叫做RPC (Remote Procedure Call 远程过程调用),Roy Fielding曾经提到了它们的区别,原文如下: I am gett ...