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

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

  • addBatch(String):添加需要批量处理的SQL语句或是参数;
  • executeBatch():执行批量处理语句

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

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

代码(3种批量处理方式对比):

package com.litian.jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.Statement; /**
* @author: Li Tian
* @contact: litian_cup@163.com
* @software: IntelliJ IDEA
* @file: JDBCTest4.java
* @time: 2020/4/4 14:18
* @desc: |批量处理事务
*/ public class JDBCTest4 { public static void main(String[] args){
// testStatement();
testPrepareStatement();
} /**
* 向数据库的数据表中插入10w条记录
* 测试如何插入,用时最短
* 1. 使用Statement:15038
*/
public static void testStatement() {
Connection conn = null;
Statement st = null;
String sql = null;
try {
conn = JDBCTools.getConnection();
JDBCTools.beginTx(conn);
st = conn.createStatement(); long begin = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
sql = String.format("insert into t_user2(username, pwd) values(name_%d, 6666)", i);
st.executeUpdate(sql);
}
long end = System.currentTimeMillis();
System.out.println(end - begin); JDBCTools.commit(conn);
} catch (Exception e) {
e.printStackTrace();
JDBCTools.rollback(conn);
} finally {
JDBCTools.release(null, st, conn);
}
} /**
* 向数据库的数据表中插入10w条记录
* 测试如何插入,用时最短
* 2. 使用PreparedStatement:13131
* 3. 在2的基础上使用批量处理:24596?这就很尴尬了
*/
public static void testPrepareStatement() {
Connection conn = null;
PreparedStatement st = null;
String sql = null;
try {
conn = JDBCTools.getConnection();
JDBCTools.beginTx(conn);
sql = "insert into t_user2(username, pwd) values(?,?)";
st = conn.prepareStatement(sql); long begin = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
st.setString(1, "name_" + i);
st.setString(2, "6666");
st.executeUpdate(); // “积攒”sql语句
st.addBatch();;
// 当积攒到一定程度,就统一地执行一次,并且清空先前积攒的sql
if((i + 1) % 300 == 0){
st.executeBatch();
st.clearBatch();
}
} // 若总条数不是批量数值的整数倍,则还需要额外再执行一次
if(100000 % 300 != 0){
st.executeBatch();
st.clearBatch();
} long end = System.currentTimeMillis();
System.out.println(end - begin); JDBCTools.commit(conn);
} catch (Exception e) {
e.printStackTrace();
JDBCTools.rollback(conn);
} finally {
JDBCTools.release(null, st, conn);
}
}
}

————————————————
版权声明:本文为CSDN博主「李英俊小朋友」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_21579045/article/details/105386353

MYSQL 之 JDBC(十四):批量处理JDBC语句提高处理效率的更多相关文章

  1. 50个SQL语句(MySQL版) 问题十四

    --------------------------表结构-------------------------- student(StuId,StuName,StuAge,StuSex) 学生表 tea ...

  2. JavaWeb学习笔记(十四)—— 使用JDBC处理MySQL大数据

    一.什么是大数据 所谓大数据,就是大的字节数据,或大的字符数据.大数据也称之为LOB(Large Objects),LOB又分为:clob和blob,clob用于存储大文本,blob用于存储二进制数据 ...

  3. mysql进阶(十四) 批量更新与批量更新多条记录的不同值实现方法

    mysql 批量更新与批量更新多条记录的不同值实现方法 在mysql中批量更新我们可能使用update,replace into来操作,下面详细介绍mysql批量更新与性能. 批量更新 mysql更新 ...

  4. Python - MySQL - mysql-connector -第二十四天

    序言 搭建MySQL环境MySQL Server. 请参考:https://blog.csdn.net/m0_37788308/article/details/79965378 或者 https:// ...

  5. MySQL学习笔记十四:优化(1)

    SQL优化 1.查看各种SQL执行的频率 mysql> show status like 'Com_select';--Com_insert,Com_delete,connections(试图连 ...

  6. mysql概要(十四)索引(补充:外键级联操作)

    [ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ][ ON UPDATE { NO ACTION | CASCADE | SE ...

  7. MYSQL数据库学习十四 存储过程和函数的操作

    14.1 为什么使用存储过程和函数 一个完整的操作会包含多条SQL语句,在执行过程中需要根据前面SQL语句的执行结果有选择的执行后面的SQL语句. 存储过程和函数的优点: 允许标准组件式编程,提高了S ...

  8. mysql概要(十四)(二)索引(补充:外键级联操作)

    [ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ] [ ON UPDATE { NO ACTION | CASCADE | S ...

  9. MySQL的高可用实现:MySQL系列之十四

    MySQL的高可以有三种实现方式:多主模式(Multi Master MySQL),MHA(Master High Availability)和 Galera Cluster:wresp 一.MHA ...

随机推荐

  1. 【Transferable NAS with RL】2018-CVPR-Learning Transferable Architectures for Scalable Image Recognition

    Transferable NAS with RL 2018-CVPR-Learning Transferable Architectures for Scalable Image Recognitio ...

  2. Python 3中,import win32com.client 出错

    在 import win32com.client 时,出现了界面: Traceback (most recent call last): File "<pyshell#1>&qu ...

  3. dubbo traceId透传实现日志链路追踪(基于Filter和RpcContext实现)

    一.要解决什么问题: 使用elk的过程中发现如下问题: 1.无法准确定位一个请求经过了哪些服务 2.多个请求线程的日志交替打印,不利于查看按时间顺序查看一个请求的日志. 二.期望效果 能够查看一个请求 ...

  4. LVS实现四层负载均衡

    LVS详解(思维导图) 1. 集群概述 1.1 Linux Cluster Linux Cluster的类型 LB(Load Balance) HA(High Available) HP(High P ...

  5. Nginx 的变量究竟是怎么一回事?

    之前说了很多关于 Nginx 模块的内容,还有一部分非常重要的内容,那就是 Nginx 的变量.变量在 Nginx 中可以说无处不在,认识了解这些变量的作用和原理同样是必要的,下面几乎囊括了关于 Ng ...

  6. 034.Kubernetes集群安全-Secret

    一 secret概述 1.1 secret作用 Secret对象,主要作用是保管私密数据,比如密码.OAuth Tokens.SSH Keys等信息.将这些私密信息放在Secret对象中比直接放在Po ...

  7. Probius:一个功能强大的自定义任务系统

    断更的这些日子,我又折腾了一个轮子,文末参考源码 大约在一年半以前写过一篇文章『探秘varian:优雅的发布部署程序』,里边有讲到我们采用类似lego的模块化方式来构建CICD的流程,虽能满足我们的需 ...

  8. SSH网上商城四

    第29课:10-SSH网上商城:购物模块的实体的封装 1.现在我们要实现购物车的模块,当用户在点击 加入购物车按钮的时候需要跳转到 上面我们需要对购物车的对象进行封装 上面一个商品就对应一个记录项,购 ...

  9. 动态追踪技术之SystemTap

    SystemTap SystemTap是一个深入检查Linux系统活动的工具,使用该工具编写一些简单的代码就可以轻松的提取应用或内核的运行数据,以诊断复杂的性能或者功能问题.有了它,开发者不再需要重编 ...

  10. .NET高级调试系列-Windbg调试入门篇

    Windbg是.NET高级调试领域中不可或缺的一个工具和利器,也是日常我们分析解决问题的必备.准备近期写2篇精华文章,集中给大家分享一下如果通过Windbg进行.NET高级调试. 今天我们来一篇入门的 ...