关于mybatis插入大批量数据效率问题

一、即便分批次用mybatis插入数据,效率依旧不高,原因:

MyBatis一次性批量插入几千条数据,为什么性能很差?-腾讯云开发者社区-腾讯云

文中提出:

        默认执行器类型为Simple,会为每个语句创建一个新的预处理语句,也就是创建一个PreparedStatement对象。在我们的项目中,会不停地使用批量插入这个方法,而因为MyBatis对于含有的语句,无法采用缓存,那么在每次调用方法时,都会重新解析sql语句。

        从资料可知,耗时就耗在,由于我foreach后有5000+个values,所以这个PreparedStatement特别长,包含了很多占位符,对于占位符和参数的映射尤其耗时。并且,查阅相关资料可知,values的增长与所需的解析时间,是呈指数型增长的。

并且文中总结用mybatis需要将每次插入的记录控制在 20~50 左右。

但是经本人测试,value数量为500、1000、1500、2000、2500 ... 10000,发现500时,每条数据插入时间为0.1秒左右,10000时,每条数据插入时间0.013秒左右,并未像作者提出的那样,具体情况不得而知。

最后,还是建议用JDBC,因为真的很快 QAQ

二、批量插入数据效率对比,不同场景所用方案:

Mybatis与JDBC批量插入MySQL数据库性能测试及解决方案 - 竹马今安在 - 博客园

三、JDBC批量插入数据

        Connection conn = null;PreparedStatement pstm =null;ResultSet rt = null;String host = System.getenv("DATA_MYSQL_HOST");String port = System.getenv("DATA_MYSQL_PORT");String database = System.getenv("DATA_MYSQL_DATABASE");//rewriteBatchedStatements=true 开启批量处理String url = String.format("jdbc:mysql://%s:%s/%s?rewriteBatchedStatements=true", host, port, database);String user = System.getenv("DATA_MYSQL_USER");String password = System.getenv("DATA_MYSQL_PASSWORD");try {Class.forName("com.mysql.jdbc.Driver");conn = DriverManager.getConnection(url, user, password);String sql = "INSERT INTO t_table(name, create_data, value) VALUES(?,?,?)";pstm = conn.prepareStatement(sql);conn.setAutoCommit(false);//计算插入时间Long startTime = System.currentTimeMillis();for (int i = 0; i < tables.size(); i++) {Point point = points.get(i);pstm.setString(1, point.getName());pstm.setTimestamp(2, new Timestamp(point.getCreateDate().getTime()));pstm.setBigDecimal(3, point.getValue());pstm.addBatch();}pstm.executeBatch();conn.commit();Long endTime = System.currentTimeMillis();System.out.println("OK,用时:" + (endTime - startTime));} catch (Exception e) {e.printStackTrace();throw new RuntimeException(e);} finally{if (pstm != null) {try {pstm.close();} catch (SQLException e) {e.printStackTrace();throw new RuntimeException(e);}}if (conn != null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();throw new RuntimeException(e);}}}

参考:JDBC实现往MySQL插入百万级数据 - 酒香逢 - 博客园

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

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

相关文章

在 JavaScript中编写 Appium 测试(入门)

1.编写一个测试 (JS) 要在 JavaScript&#xff08;Node.js&#xff09;中编写 Appium 测试&#xff0c;我们需要选择一个与 Appium 兼容的客户端 库。维护最好的库和 Appium 团队推荐使用的库是 WebdriverIO, 所有就让我们使用它吧。既然我们已经安装了 Appium&#xff0c;我们…

【android bluetooth 框架分析 04】【bt-framework 层详解 6】【Properties介绍】

DeviceProperties、AdapterProperties、StorageModule、以及 bt_config.conf 是 AOSP Bluetooth 栈中 设备属性管理与持久化系统 的核心组成部分&#xff0c;它们之间关系紧密&#xff0c;但职责各有不同。 下面我将依次讲解它们的区别与联系. 注意: 在代码里面 还有 Blueto…

@Resource vs @Autowired 在Spring中的使用和区别

Resource vs Autowired 在Spring中的使用和区别 在Spring开发中&#xff0c;我们常会接触两个用于实现引用模块注入的注解&#xff1a;Resource 和 Autowired。它们在使用上有些相似之处&#xff0c;但本质上来看&#xff0c;有所区别。本文将给出两者的详细介绍和对比&#x…

Mac M4 芯片运行大模型指南,包括模型微调与推理

Mac M4 芯片运行大模型指南&#xff0c;模型微调与推理 背景模型推理 Ollama&#x1f50d; 举例说明&#xff1a;踩坑 模型微调 unsloth 背景 在国补、教育优惠、京东会员500优惠券等众多优惠之下。 我拿下了Macmini M4 16G 内存万兆网卡。在机器到手的第一时间&#xff0c;马…

微信小程序中安装vant

以下是微信小程序中安装 Vant 的详细步骤&#xff1a; 1. 初始化项目 在微信小程序项目目录下&#xff0c;打开终端&#xff0c;执行以下命令进行项目初始化&#xff1a; npm init -y该命令会快速生成一个默认的package.json文件&#xff0c;-y参数表示直接使用默认配置&…

今天做的力扣SQL

我本地markdown的东西直接复制出来了。 多说一嘴&#xff0c;今天早上六点醒了&#xff0c;然后被外面吵&#xff0c;心里也担心找实习就一直睡不着了。索性直接来实验室&#xff0c;这一上午感觉好快啊。幸运的是&#xff0c;自己也没有浪费时间&#xff0c;还行吧。SQL欠的账…

【开发常用命令】:docker常用命令

docker常用命令 基础命令 # 启动docker systemctl start docker # 关闭docker systemctl stop docker # 重启docker systemctl restart docker # 设置开机自启动 systemctl enable docker # 查看docker运行状态 systemctl status docker # 查看docker版本号信息 docker versi…

安装配置以太链钱包工具

安装go语言环境 1、官网下载go安装包并上传到指定机器 https://golang.google.cn/dl/ 2、解压缩至指定位置&#xff1a; tar -C /usr/local -xzf go1.21.0.linux-amd64.tar.gz 3、将 /usr/local/go/bin 目录添加至 PATH 环境变量&#xff1a; export PATH$PATH:/usr/local/g…

论文阅读:speculative decoding

Fast Inference from Transformers via Speculative Decoding 论文地址&#xff1a;https://arxiv.org/pdf/2211.17192 speculative sampling 为了从分布 p ( x ) p(x) p(x) 中采样&#xff0c;我们实际上是从分布 q ( x ) q(x) q(x) 中采样 x x x&#xff0c;如果 q ( …

java操作word里的表格

依赖&#xff1a; <dependency><groupId>com.techCoLtd</groupId><artifactId>aspose-words-16.4.0-jdk16</artifactId><classifier>jdk16</classifier> </dependency>/*** 删除表格及表格的行* throws Exception*/ private s…

单链表经典算法题之分割链表

给定一个头结点和一个值x&#xff0c;是链表中所有小于x的值都在x前面 typedef struct ListNode ListNode; struct ListNode* partition(struct ListNode* head, int x) { //思路一&#xff1a;在原链表上进行修改 //思路二&#xff1a;创建新链表&#xff0c;使用哨兵位&…

Modbus TCP转DeviceNet网关连接ABB变频器配置案例

某工厂需要将支持Modbus TCP协议的上位机控制系统&#xff08;如PLC或SCADA&#xff09;与支持DeviceNet协议的变频器&#xff08;如ABB ACS880、施耐德ATV320等&#xff09;进行通信。为实现协议转换&#xff0c;采用开疆智能Modbus TCP转DeviceNet网关KJ-DVCZ-MTCPS作为中间设…

【力扣 简单 C++】206. 反转链表

目录 题目 解法一&#xff1a;迭代 解法二&#xff1a;递归 题目 待添加 解法一&#xff1a;迭代 class Solution { private:ListNode* reverse(ListNode* head){ListNode* newHead {};while (head){ListNode* nextNode {head->next};head->next newHead;newHead …

计算机视觉之三维重建(深入浅出SfM与SLAM核心算法)—— 1. 摄像机几何

文章目录 1. 针孔相机1.1. 针孔成像1.2. 光圈对成像的影响 2. 透视投影相机2.1. 透镜成像2.2. 失焦2.3. 径向畸变2.4. 透视投影的性质 3. 世界坐标系到像素坐标系的变换4. 其它相机模型4.1. 弱透视投影摄像机4.2. 正交投影摄像机4.3. 各种摄像机模型的应用场合 课程视频链接&am…

第十三节:第七部分:Stream流的中间方法、Stream流的终结方法

Stream流常见的中间方法 Stream流常见的终结方法 代码 学生类&#xff08;代码一与代码二共涉及到的类&#xff09; package com.itheima.day28_Stream;import java.util.Objects;public class Student implements Comparable<Student> {private String name;private i…

深入理解 Go 中的字节序(Endianness)检测代码

深入理解 Go 中的字节序&#xff08;大小端&#xff09;检测代码 在计算机系统中&#xff0c;字节序&#xff08;Endianness&#xff09; 是指多字节数据类型&#xff08;如 int16、int32 等&#xff09;在内存中的存储顺序。Go 语言标准库提供了对大端&#xff08;Big-endian&…

JAVA:RabbitMQ 消息持久化机制的技术指南

🐇 1、简述 在使用 RabbitMQ 构建可靠消息系统时,消息丢失是必须避免的问题。为此,RabbitMQ 提供了消息持久化机制(Message Durability),可以保障在 Broker 异常宕机后数据不会丢失。 本篇博客将从原理出发,结合 Spring Boot 实战讲解如何正确实现 RabbitMQ 消息持久…

tabs页签嵌套表格,切换表格保存数据不变并回勾

需求&#xff1a;点击左边的tab页签&#xff0c;请求右侧表格数据&#xff1b;如果返回的接口数据存在taskuser字段并不为null&#xff0c;那么按照这个字段去回勾数据。如果存在数据&#xff0c;但与后面所勾选的数据项不同&#xff0c;按照后面勾选的为主。 <el-tabs tab-…

Java Kafka消费者

基础 Java Kafka消费者主要通过以下核心类实现&#xff1a; KafkaConsumer&#xff1a;消费者的核心类&#xff0c;用于创建消费者对象进行数据消费1ConsumerConfig&#xff1a;获取各种配置参数&#xff0c;如果不配置就使用默认值1ConsumerRecord&#xff1a;每条数据都要封…

Git操作问题及解决方案-记录5

Git操作问题及解决方案 问题一&#xff1a;本地更改与远程更新冲突 问题描述 当本地文件有未提交的更改&#xff0c;同时远程仓库也有更新时&#xff0c;执行git pull会导致冲突。 $ git pull origin main error: Your local changes to the following files would be overw…