Hibernate 批量插入速度慢的原因和解决方法

news2024/12/27 9:16:11

由于业务需要一次性连续写入超过10k条以上的新数据,当对象超过10个成员变量以后,整个写入过程居然需要长达35秒,这个速度是不能接受的,故此研究了一下怎么开启Hibernate批量写入的功能。

我这边使用的是Hibernate 5.6.15

在网上找了一些答案,都提到了Hibernate自带批量写入的功能,通过在

“hibernate.cfg.xml”的文件中增加一个特征

<property name="hibernate.jdbc.batch_size">50</property>

必须在connection.url 的后面增加一个参数?rewriteBatchedStatements=true&amp;

我的配置:

<!--数据源配置-->
        <property name="connection.username">root</property>
        <property name="connection.password">12345678</property>
        <property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/hibernate_test?rewriteBatchedStatements=true&amp;userUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=UTC</property>

<!--批量处理配置-->
        <property name="hibernate.jdbc.batch_size">50</property>

我这边实测,发现速度并没有变快,然后使用WireShake监听了一下程序对MYSQL的网络请求,发现如果写入1W条数据,那么就会发生2W多次的TCP链接,每次链接传输的数据内容虽然加密了,但是内容并不多,明显不是批量发送的多个条目,而是一个一个发送的。

这一点让我觉得很奇怪,明明启用了Hibernate的批量写入功能,为什么还是一条一条写入的?

网上的大牛们指出,如果写入的对象的ID采用了Hibernate自增策略,那么批量写入功能就会自动关闭,因为自增的前提是获取到上次写入的对象得到的ID+1来实现的。

那么,既然知道写入慢的原因了,那么解决起来也就简单了。

首先删掉自增ID的策略,然后在代码中增加手动赋值ID的功能

        String hql = "from People order by id desc";//将当前数据库的数据采用ID倒序排列
        Query query = session.createQuery(hql);
        query.setMaxResults(1);//读取第一个数据
        List<People> list = query.list();
        Integer lasstId = 0;
        if(list.size() == 0){//如果读取队列长度为0.说明这是一个空表,ID赋值为1
            lasstId = 1;
        }else{//获取最后一个ID值
            lasstId = list.get(0).getId()+1;
        }

        List<People> peopleList = new ArrayList<>();

        for(int i=0;i<10000;i++){
            People people = new People();
            people.setId(lasstId++);//每次赋值结束后自增1
            people.setName("测试"+i);
            people.setMoney(100*i);
            peopleList.add(people);
        }
        session.beginTransaction();
        for(int i=0;i<10000;i++){
            session.save(peopleList.get(i));
        }
        
        session.getTransaction().commit();
        session.close();

通过这种方式,就可以使用Hibernate的批量写入功能。

通过实际监听的结果,同样写入1W条数据,实际发生了800多次TCP链接

既然如此,我干脆把批量处理的SQL条数改成了10000条

<property name="hibernate.jdbc.batch_size">10000</property>

结果速度就更快了,而且TCP只发生了105次连接

如果实际投入生产是不可以改成10000条保存一次的,因为这里使用的是Hibernate的一级缓存用于累积数据,如果你要保存的对象有很多成员变量,1W条数据很容易让缓存内存溢出,所以,针对每个人实际业务的情况酌情处理,即便每次只有50条,也相当于加速了50倍,也是很快啦。

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

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

相关文章

推动光模块技术发展:从400G、800G到1.6T

随着数据通信领域的持续发展&#xff0c;对于更快、更高传输速率的需求也在不断增长。作为现代数据传输的基石&#xff0c;光模块技术不断进步以满足这一需求。其中一项重大进展是网络速率从400G提升到800G&#xff0c;并将向1.6T继续发展。让我们深入探讨这些技术的演变&#…

Java语言程序设计基础篇_编程练习题***17.9 (地址簿)

目录 题目&#xff1a;***17.9 (地址簿) 习题思路 代码示例 结果展示 题目&#xff1a;***17.9 (地址簿) 编写程序用于存储、返回、增加&#xff0c;以及更新如图 17-20 所示的地址薄。使用固定长度的字符串来存储地址中的每个属性。使用随机访问文件来读取和写人一个地址…

刚刚认证!网络主播成为国家新职业,易播易赚打造打造职业入门全新模式

近期&#xff0c;人力资源和社会保障部会同国家市场监督管理总局、国家统计局日前增设网络主播为国家新职业&#xff0c;这标志着网络主播的职业身份在“国家确定职业分类”上首次得以确立。 据人社部此前印发的《关于加强新职业培训工作的通知》表示&#xff0c;新职业从业者可…

代码随想录算法训练营第二十三天| 39. 组合总和 40.组合总和II 131.分割回文串

目录 一、LeetCode 39. 组合总和思路&#xff1a;C代码 二、LeetCode 40.组合总和II思路C代码 三、LeetCode 131.分割回文串思路C代码 总结 一、LeetCode 39. 组合总和 题目链接&#xff1a;LeetCode 39. 组合总和 文章讲解&#xff1a;代码随想录 视频讲解&#xff1a;带你学…

直播平台直播API集成之快手篇

前言: 本篇我们来介绍如何使用快手 的直播API创建直播。 准备工作: 1、你首先得有个快手账号; 2、创建快手应用,填写应用审核信息,等待应用创建审核通过,应用成功创建后在开发与上线前还要提前做好API权限申请,如果你只需要获取用户基本信息,以及得到直播API的访问权限…

Python | Leetcode Python题解之第377题组合总和IV

题目&#xff1a; 题解&#xff1a; class Solution:def combinationSum4(self, nums: List[int], target: int) -> int:dp [1] [0] * targetfor i in range(1, target 1):for num in nums:if num < i:dp[i] dp[i - num]return dp[target]

合宙LuatOS产品规格书——Air700EMQ

Air700EMQ是合宙通信的LTE Cat.1bis通信模块&#xff0c; 依托移芯EC716E平台&#xff0c;支持先进的LTE 3GPP Rel.13技术。 主要特点如下&#xff1a; 1. 技术平台与标准支持&#xff1a; Air700EMQ采用移芯EC716E平台&#xff0c;基于先进的LTE技术。支持LTE 3GPP Releas…

leetcode234. 回文链表(java实现)

题目描述&#xff1a; 本道题的思路可以使用集合先存储链表的值&#xff0c;然后进行判断即可。 总体思路比较简单。 代码实现&#xff1a; class Solution {public boolean isPalindrome(ListNode head) {List<Integer> res new ArrayList();ListNode cur head;whil…

3分钟快速本地搭建RSShub服务器并结合内网穿透实现无公网IP远程访问

文章目录 前言1. Docker 安装2. Docker 部署Rsshub3. 本地访问Rsshub4. Linux安装Cpolar5. 配置公网地址6. 远程访问Rsshub7. 固定Cpolar公网地址8. 固定地址访问 前言 今天和大家分享的是如何在本地快速简单部署Rsshub工具&#xff0c;并结合cpolar内网穿透工具使用公网地址远…

Remote Sensing(MDPI)期刊投稿历程(CV方向)

一、期刊简介 期刊官网&#xff1a;https://www.mdpi.com/journal/remotesensing 影响因子&#xff08;2024&#xff09;&#xff1a;4.2 分区&#xff1a;JCR:Q1。中科院二区 版面费&#xff1a;2700瑞士法郎&#xff08;约21000rmb&#xff09; 二、投稿时间线 2024.06.20…

科研绘图系列:R语言对角线矩阵图(corrplot plot)

介绍 对角线矩阵图(Diagonal Matrix Plot)是一种特殊类型的图表,用于可视化对角线矩阵中的元素。对角线矩阵是一种方阵,其中非对角线上的元素都是零,而对角线上的元素可以是任意值。这种矩阵在数学和计算机科学中非常有用,尤其是在线性代数、特征值问题和对角化等操作中…

C语言中的野指针

野指针是指指针指向的位置是随机的&#xff0c;不明确的&#xff0c;未知的&#xff0c;没有限制的。 野指针的成因 指针未初始化 如上图&#xff0c;指针没有初始化&#xff0c;则指针指向的地址是随机的&#xff0c;若该地址已经被其他程序占用&#xff0c;且对指针进行解引…

C++入门基础(内容太干,噎住了)

文章目录 1.缺省参数 2.函数重载 2.1重载条件&#xff1a; 1.参数类型不同 2.参数个数不同 3.参数类型顺序不同 2.2不做重载条件情况&#xff1a; 1.返回值相同时 2.当全缺省遇见无参数 3.引用 3.1引用特性&#xff1a; 3.2引用的使用 1.缺省参数 1.缺省参数是声明…

中庸就是五五开,各打五十大板吗

中庸指的是&#xff0c;人生行事应该把握一个度&#xff0c;既不过分&#xff0c;也无不及&#xff0c;以中为贵&#xff0c;以和为美。 中庸关键在于“中”&#xff0c;要求适中适度、恰如其分。 《论语•先进》中提到&#xff0c;有一次&#xff0c;子路问孔子&#xff0c;…

Springboot中使用Elasticsearch(部署+使用+讲解 最完整)

Elasticsearch&#xff1a;用于数据存储、计算和搜索 Mysql&#xff1a;擅长事务类型操作&#xff0c;可以确保数据的安全和一致性 Elasticsearch&#xff1a;擅长海量数据的搜索、分析、计算 基于这个特点我打算改造用户方面的功能&#xff0c;基于用户量比较多&#xff0c;…

电影《名侦探柯南:百万美元的五棱星》 观后感

上周看了电影《名侦探柯南&#xff1a;百万美元的五棱星》,个人觉得这可能是相对于柯南系列的重度粉丝来说是相当不错的&#xff0c;对于自己这个外行的人来说&#xff0c;可能有些故事背景并不了解&#xff0c;以及里边出场的人物并不熟悉&#xff0c;整体看下来觉得算是中规中…

复习Vue笔记

笔记来源于黑马程序员相关上课笔记 基于脚手架创建前端工程 环境要求 node.js&#xff1a;前端项目的运行环境&#xff08;相当于Java的运行环境JDK&#xff09; npm&#xff1a;JS的包管理工具/器 npm腾讯镜像&#xff1a;npm config set registry http://mirrors.cloud.te…

BaseCTF-Misc-Week2-WP

目录 1、二维码1-街头小广告 2、反方向的雪 3、黑丝上的flag 4、海上又遇了鲨鱼 5、Base?! 6、ez_crypto 7、前辈什么的最喜欢了 8、哇&#xff01;珍德食泥鸭 9、Aura 酱的旅行日记 I 10、Aura 酱的旅行日记 II 11、Aura 酱的旅行日记 III 12、Aura 酱的旅行日…

Docker镜像制作(使用GPU)

由于最近参加天池的大模型比赛&#xff0c;在复赛阶段需要制作并提交Docker进行模型的推理&#xff0c;因此在这里记录一下Docker制作的过程。 准备 featurize阿里云账号 由于需要使用GPU资源&#xff0c;因此选择了预装Docker的featurize服务器。 开通阿里云容器镜像服务 …

74HC595的用法与原理

DS/LDSI&#xff08;SER&#xff09;&#xff0c;串行数据输入引脚 OE/LEDN&#xff0c;输出使能控制脚&#xff0c;它是低电才使能输出&#xff0c;所以接GND RCK/LDSTR&#xff08;STCP&#xff09;&#xff0c;存储寄存器时钟输入引脚。上升沿时&#xff0c;数据从移位寄存器…