JDBC和Mybatis中的批处理

news2024/11/14 15:19:27

src目录下创建jdbc.properties mysql驱动5.1.6之后,只需要配置url,username,password

mysql 5.1.6之后可以无需Class.forName("com.mysql.jdbc.Driver")
* 从jdk1.5之后可以通过配置文件来配置
* 会自动加载mysql驱动jar包下META-INF/services/java.sql.Driver文本中的类名去注册

JDBC工具类

package com.example;

import java.io.FileInputStream;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;

/**
 * JDBC工具类
 * @author hrui
 * @date 2024/8/29 16:45
 */
public class JDBCUtils {
    private static String url;
    private static String username;
    private static String password;
    private static Properties properties=new Properties();

    static{
        try {
            properties.load(new FileInputStream("src\\jdbc.properties"));
            url = properties.getProperty("url");
            username = properties.getProperty("username");
            password = properties.getProperty("password");
        }catch (IOException e){
            e.printStackTrace();
            //throw new RuntimeException(e);
        }
    }


    public static Connection getConnection() throws SQLException {
        //如果这样写,虽然不需要定义url,username,password,但是每次都要从properties获取url,username,password,效率不高 所以还是定义url,username,password 静态块里赋值
        //return DriverManager.getConnection(properties.getProperty("url"), properties.getProperty("username"), properties.getProperty("password"));
        return DriverManager.getConnection(url, username, password);
    }


    public static void closed(ResultSet rs, Statement stmt, Connection conn){
        try {
            if(rs!=null){
                rs.close();
            }
            if(stmt!=null){
                stmt.close();
            }
            if(conn!=null){
                conn.close();
            }
        }catch (SQLException e){
            e.printStackTrace();
        }
    }
}

 以下执行代码数据一多,执行非常慢

package com.example;

import java.sql.Connection;
import java.sql.PreparedStatement;

/**
 * @author hrui
 * @date 2024/8/29 17:51
 */
public class BathDemo {
    /**
     * 批处理
     * JDBC的批处理语句包括下面方法:
     * addBatch():添加需要批量处理的sql语句或参数
     * executeBatch():执行批处理语句
     * clearBatch():清空批处理语句
     * JDBC连接MySQL时,如果要使用批处理功能,再url中加参数?rewriteBatchedStatements=true
     * 批处理往往和PreparedStatement一起搭配使用,可以减少编译次数,效率提高
     * @param args
     */
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement ps = null;
        long start = System.currentTimeMillis();
        System.out.println("开始批处理:"+start);
        try {
            conn = JDBCUtils.getConnection();

            //conn.setAutoCommit(false);

            String sql="insert into admin2 values(null,?,?)";
            ps = conn.prepareStatement(sql);

            for (int i = 0; i < 100000; i++) {
                ps.setObject(1,"hrui"+i);
                ps.setObject(2,"123456");
                ps.executeUpdate();
            }

           // conn.commit();

            long end = System.currentTimeMillis();
            System.out.println("结束批处理:"+end);
        }catch (Exception e){
            e.printStackTrace();
//            if(conn!=null){
//                try {
//                    conn.rollback();
//                } catch (Exception e1) {
//                    e1.printStackTrace();
//                }
//            }
        }finally {
            JDBCUtils.closed(null,ps,conn);
        }
    }
}

以下代码注意在url后面加

?rewriteBatchedStatements=true

JDBC中正确的批处理

package com.example;

import java.sql.Connection;
import java.sql.PreparedStatement;

/**
 * @author hrui
 * @date 2024/8/29 18:59
 */
public class BathDemo2 {

    //正确的批处理方式
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement ps = null;
        long start = System.currentTimeMillis();
        System.out.println("开始批处理:"+start);
        try {
            conn = JDBCUtils.getConnection();

            conn.setAutoCommit(false);

            String sql="insert into admin3 values(null,?,?)";
            ps = conn.prepareStatement(sql);//这里执行完  sql已经发送到DBMS进行编译

            for (int i = 0; i < 1000000; i++) {

                ps.setObject(1,"hrui"+i);
                ps.setObject(2,"123456");
                ps.addBatch();//循环一次 添加到批处理 添加的是参数
                if((i+1)%2000==0){
                    ps.executeBatch();//满1000条执行一次
                    ps.clearBatch();//执行完清空
                }
            }

            conn.commit();
            long end = System.currentTimeMillis();
            System.out.println("结束批处理:"+end);
            //所用时间秒  一般5000条这样数据大概耗时10秒
            System.out.println("所用时间:"+(end-start));
        }catch (Exception e){
            e.printStackTrace();
//            if(conn!=null){
//                try {
//                    conn.rollback();
//                } catch (Exception e1) {
//                    e1.printStackTrace();
//                }
//            }
        }finally {
            JDBCUtils.closed(null,ps,conn);
        }
    }
}

DataSource是扩展版就是企业用的,我们现在所有的连接都是从DataSource里拿的  那么像HikariCP,druid,C3P0等数据库连接池都是实现DataSource的  默认我们在使用SpringBoot时候 使用的是HikariCP数据库连接池,也就是说DataSource其实就是数据库连接池的接口,在使用SpringBoot的时候,如果非不想使用默认或者druid,就是不想使用连接池,那么必须要指定一个DataSource的实现类,否则无法连接,Spring提供了一个DriverManagerDataSource,另外一种方式是你自己实现DataSource  然后指定type为自定义的.获取连接之后  还是通过Statement或者PreparedStatement去执行sql

下次是使用连接池的,可以有多个数据库连接去执行SQL操作 因为内存中循环肯定很快

insert into admin(name,pwd) values(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),

配置DriverManagerDataSource

那么再执行下面代码就是一个每次一个连接 insert into admin(name,pwd) values(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx),(xxx,xxx)  执行完关闭conn,

然后再打开 再执行 每次都只有一个连接在处理

速度会慢很多

另外 mybatis的这种执行方式 对于?rewriteBatchedStatements=true好像并没有多大作用,不过有应该是好的

<foreach>标签的影响

  • 不需要设置rewriteBatchedStatements=true:因为你使用的是MyBatis的<foreach>标签,这种方式本质上已经生成了一条带有多个值对的SQL语句,类似INSERT INTO admin (name, pwd) VALUES ('name1', 'pwd1'), ('name2', 'pwd2'), ...,这与rewriteBatchedStatements=true的效果类似。
  • 因此,在这种情况下,加上rewriteBatchedStatements=true对性能提升不会有显著作用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2086469.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python深度学习股价预测、量化交易策略:LSTM、GRU深度门控循环神经网络|附代码数据

全文链接&#xff1a;https://tecdat.cn/?p37539 原文出处&#xff1a;拓端数据部落公众号 分析师&#xff1a;Shuo Zhang 本文以上证综指近 22 年的日交易数据为样本&#xff0c;构建深度门控循环神经网络模型&#xff0c;从股价预测和制定交易策略两方面入手&#xff0c…

8月29日

思维导图 作业&#xff1a; 仿照string类&#xff0c;实现myString 代码 mystring.h #ifndef MYSTRING_H #define MYSTRING_H#include <iostream> #include<string.h>using namespace std;class myString { private:char *str;int size;public://无参构造myStr…

在自己的数据集上测试coco评价指标——以Mar20为例

参考&#xff1a; 1.在自己的数据集上调用cocoapi计算map 2. COCO Result Format 3.COCO result json 之前的模型都是在COCO数据集上训练&#xff0c;数据集的标注以及结果的生成格式都是按照官方的格式组织的&#xff0c;调用cocoapi和官方下载的instance_val2017.json计算就可…

Win11 操作(七)声音降噪

前言 为了听脚步和不外放声音影响到女朋友休息&#xff0c;于是买了S21头戴式耳机&#xff0c;虽然目的都达到了&#xff0c;但是又有新问题出现 损害队友听力 由于天气炎热&#xff0c;家里都开着风扇&#xff0c;但是耳机没有降噪功能所以我的麦噪音极大&#xff0c;这就导…

OpenLayers3, 设置地图背景

文章目录 一、前言二、代码实现三、总结 一、前言 本文基于OpenLayers3&#xff0c;实现地图加入背景图的功能。 二、代码实现 <!DOCTYPE html> <html xmlns"http://www.w3.org/1999/xhtml"> <head><meta http-equiv"Content-Type"…

封装string

仿照string类&#xff0c;实现mystring #include <iostream> #include<string.h> using namespace std;class MyString {private:char *str; //记录c风格的字符串int size0; //记录字符串实际长度public://无参构造&#xff1a;定义了一个字符串MyStri…

Noise, Dynamic Range and Bit Depth in Digital SLRs --- 数字单反相机中的噪点、动态范围和位深

系列文章目录 文章目录 系列文章目录前言数字单反相机中的噪点、动态范围和位深二、噪声的来源2.1 光子散粒噪声2.2 读出噪声2.3 模式噪声2.4 热噪声2.5 像素响应不均匀性&#xff08;PRNU&#xff09;2.5 量化误差 前言 Noise, Dynamic Range and Bit Depth in Digital SLRs …

golang私有仓库遇到的问题记录

问题1: is this a git repository? 原因&#xff1a;git保存了错误的用户名密码 我是mac系统&#xff0c;在启动台-》其他-》钥匙串&#xff0c;找到git的登录信息&#xff0c;将错误的钥匙串删除即可。 问题2: remote: The project you were looking for could not be found…

HarmonyOS鸿蒙开发( Beta5版)Navigation组件常规加载与动态加载

简介 应用在加载页面时&#xff0c;如果引入暂时不需要加载的模块&#xff0c;会导致页面加载缓慢和不必要的内存占用。例如当页面使用Navigation组件时&#xff0c;主页默认加载子页面&#xff0c;此时若子页面使用了Web组件&#xff0c;则会提前加载Web相关的so库&#xff0…

Mybatis:基础巩固-DQL

目录 一、概述二、数据准备三、基础查询四、条件查询五、聚合函数六、分组查询七、排序查询八、分页查询九、DQL执行顺序 一、概述 主要用于对数据的查询操作&#xff0c;使用的关键字SELECT SELECT 字段列表 FROM 表名 WHERE 条件列表 GROUP BY 分组字段 HAVING 分组后条件列表…

Renesa Version Board和微信小程序通信

目录 概述 1. 系统框架结构 1.1 功能介绍 1.2 系统框图 2 微信小程序开发 2.1 UI介绍 2.2 代码实现 3 功能实现 3.1 通信协议 3.2 系统测试 概述 本文主要介绍基于Renesa Version Board&#xff0c;采集多个传感器数据&#xff0c;并将这些数据通过蓝牙模块发送微信…

《黑神话悟空》:国产3A游戏的崛起与AI绘画技术的融合

一、游戏简介 近年来&#xff0c;国产3A游戏《黑神话悟空》以其精美的画面、丰富的剧情和独特的文化底蕴吸引了众多玩家的关注。这款游戏以中国古典名著《西游记》为背景&#xff0c;讲述了孙悟空历经磨难&#xff0c;最终成长为斗战胜佛的故事。在游戏制作过程中&#xff0c;开…

办公必备,免费的在线万能格式转换工具

在当今数字化时代&#xff0c;文件格式转换已成为办公和日常生活中不可或缺的一部分。随着各种文件格式的不断涌现&#xff0c;人们对于高效、便捷的文件转换工具的需求日益增长。小编将为大家介绍几款免费的在线万能格式转换工具&#xff0c;帮助大家轻松应对各种文件转换需求…

golang uint8 转int出现ascll码值

在Golang中&#xff0c;uint8类型被用来表示ASCII码值。 结果是51 如果是uint8(3)的话结果还是3 所以在我们想把一个uint8类型的字符数字转换为int类型时需要特殊处理 减去对应ASCII码’0’的值 结果就是3了

Python循环结束语句 break语句 continue语句

Python break 语句 Python break语句&#xff0c;就像在C语言中&#xff0c;打破了最小封闭for或while循环。 break语句用来终止循环语句&#xff0c;即循环条件没有False条件或者序列还没被完全递归完&#xff0c;也会停止执行循环语句。 break语句用在while和for循环中。 …

df的 一列,是文字, 比如 xxxxx-1, xxxx-2 , 最后有 -1 或者 -2,把最后的数字减去1,写道一个新的列里面

file_pathrf"D:\file\工作簿1-1.xlsx"# from stutil import PandasUtil import pandas as pd dfpd.read_excel(file_path) # PandasUtil. # df的 一列&#xff0c;是文字&#xff0c; 比如 xxxxx-1, xxxx-2 , 最后有 -1 或者 -2&#xff0c;把 -1 变成 -0&#xff…

【测试面试题】14题常见APP测试面试题(参考答案)

大家好&#xff0c;这份面试题不难&#xff0c;都是一些基础题。 先上一个面试题汇总图&#xff0c;建议大家可以先思考下如果是自己能不能回答全&#xff0c;再去对照看参考答案。 下面为参考答案&#xff1a; 一、基础篇 1、APP的测试流程&#xff1f; APP测试流程与web测…

数分基础(03-3)客户特征分析--Tableau

文章目录 客户特征分析 - Tableau1. 说明2. 思路与步骤3. 数据准备和导入3.1 用EXCEL初步检查和处理数据3.1.1 打开3.1.2 初步检查&#xff08;1&#xff09;缺失值检查缺失值处理 &#xff08;2&#xff09;格式化日期字段&#xff08;3&#xff09;其他字段数据类型 &#xf…

在离线环境中安装依赖包

在离线环境中安装依赖包的方法&#xff1a; 参考文章&#xff1a; 1.如何离线下载python依赖包 2.python 依赖包打包 离线下载 3.Python的国内安装源&#xff08;也称为镜像源&#xff09; 最终安装效果&#xff0c;有部分失败的&#xff0c;重新下载失败的再去试试

达梦数据库启动与停止

1.1.1数据库启停之菜单方式启动、停止达梦数据库 当数据库服务器是Windows时&#xff0c;开始-->达梦数据库-->点击“DM服务查看器”&#xff0c;找到 “DmService【数据库实例名】” -->右键启动或停止。 下图中数据库实例名是DMSERVER 当数据库服务器是Linux时&…