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

由于业务需要一次性连续写入超过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赋值为1lasstId = 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++);//每次赋值结束后自增1people.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.rhkb.cn/news/413512.html

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

相关文章

Python 从入门到实战3(列表的简单操作)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;通过熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们通过python小栗子来学习python基础知识语法&#xff…

C语言中的“#”和“##”

目录 开头1.什么是#?2.什么是##?3.#和##的实际应用输出变量的名字把两个符号连接成一个符号输出根据变量的表达式…… 下一篇博客要说的东西 开头 大家好&#xff0c;我叫这是我58。在今天&#xff0c;我们要学一下关于C语言中的#和##的一些知识。 1.什么是#? #&#xff0…

《黑神话:悟空》:30%抽成真相

《黑神话&#xff1a;悟空》自建服务器出售&#xff1f;揭秘游戏界的30%抽成真相&#xff01; 近年来&#xff0c;随着游戏行业的迅猛发展&#xff0c;游戏开发商与发行平台之间的利益分配问题逐渐成为业界关注的焦点。其中&#xff0c;《黑神话&#xff1a;悟空》作为一款备受…

JS基础之【基本数据类型与类型间的隐式显示转换】

&#x1f680; 个人简介&#xff1a;某大型国企高级前端开发工程师&#xff0c;7年研发经验&#xff0c;信息系统项目管理师、CSDN优质创作者、阿里云专家博主&#xff0c;华为云云享专家&#xff0c;分享前端后端相关技术与工作常见问题~ &#x1f49f; 作 者&#xff1a;码…

streamlit+wordcloud使用pyinstaller打包遇到的一些坑

说明 相比常规的python程序打包&#xff0c;streamlit应用打包需要额外加一层壳&#xff0c;常规app.py应用运行直接使用 python app.py就可以运行程序了&#xff0c;但streamlit应用是需要通过streamlit命令来运行 streamlit app.py所以使用常规的pyinstaller app.py打包是…

云同步的使用

云同步技术是一种在多个设备或系统之间保持数据一致性的技术&#xff0c;它通常依赖于云存储服务来实现。在Java中&#xff0c;实现云同步功能通常需要与云服务提供商的API进行交互&#xff0c;如Amazon S3、Google Cloud Storage、Microsoft Azure Blob Storage等。 以下是一个…

秋风送爽,夏意未央|VELO Prevail Revo坐垫,一骑绿动起来吧~

夏末秋初&#xff0c;当第一片落叶缓缓飘落&#xff0c;是时候骑上你的自行车&#xff0c;迎接新的季节啦。带上维乐Prevail Revo坐垫&#xff0c;因为它独树一帜地采用EVA与回收咖啡渣精制而成的轻量发泡提升了减震性能&#xff0c;可以让你的每一次骑行都充满意义。    “…

虚幻引擎(Unreal Engine)技术使得《黑神话悟空传》大火,现在重视C++的开始吃香了,JAVA,Go,Unity都不能和C++相媲美!

虚幻引擎&#xff08;Unreal Engine&#xff09;火了黑神话游戏。 往后&#xff0c;会有大批量的公司开始模仿这个赛道&#xff01; C 的虚拟引擎技术通常指的是使用 C 语言开发的游戏引擎&#xff0c;如虚幻引擎&#xff08;Unreal Engine&#xff09;等。以下是对 C 虚拟引…

【virtuoso】INV 原理图+前仿真 + 版图 + 后仿真

采用SMIC工艺&#xff0c;不同工艺版图窗口可能有差异 1. 原理图&前仿真 1.1 绘制原理图 PMOS: NMOS宽长比2&#xff1a;1 PMOS开启导通电阻大一点&#xff0c;这样设置&#xff0c;可以使得阈值电压是VDD/2 按 i&#xff0c;可以插入器件按p&#xff0c;可以放置端口 1.2…

【机器学习】聚类算法的基本概念和实例代码以及局部度量学习的概念和实例代码

引言 聚类算法在许多领域都有广泛的应用&#xff0c;例如数据挖掘、生物信息学、图像处理等。 文章目录 引言一、聚类算法1.1 K-Means算法1.2 DBSCAN算法1.3 层次聚类&#xff08;Hierarchical Clustering&#xff09;算法1.4 高斯混合模型&#xff08;Gaussian Mixture Model&…

Web自动化测试实战--博客系统

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f525;个人专栏&#xff1a;测试&#x1f4d5;格言&#xff1a;吾愚多不敏&#xff0c;而愿加学欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 1.项目效果展示 2.编写web测试用例 3.自动化测试脚本开发 3.1创建空项目 引…

Web-gpt

AJAX AJAX&#xff08;Asynchronous JavaScript and XML&#xff0c;异步JavaScript和XML&#xff09;是一种用于创建动态网页应用的技术。它允许网页在不重新加载整个页面的情况下&#xff0c;异步地从服务器请求数据&#xff0c;并将这些数据更新到网页上。这提高了用户体验…

大语言模型-GLM-General Language Model Pretraining

一、背景信息&#xff1a; GLM是2020-2021年由智谱AI研究并发布的预训练语言模型。 GLM是一种基于自回归空白填充的通用预训练语言模型。 GLM 通过添加二维位置编码和允许任意顺序预测空白区域&#xff0c;改进了空白填充预训练&#xff0c;在NLU任务上超越了 BERT 和 T5。 GL…

12 对话模型微调2

1 P-Tuning P-Tuning 是在 Prompt-Tuning的基础上&#xff0c;通过新增 LSTM 或 MLP 编码模块来加速模型的收敛&#xff1b; 之前的实验也看到了使用prompt训练速度很慢&#xff0c;那么P-Tuning呢 参数占比&#xff1a; trainable params: 5,267,456 || all params: 1,308,37…

Llamaindex RAG实践

加入xtunert文档作为提示词 让大模型理解xtuner

Python 算法交易实验85 QTV200日常推进-钳制指标与交易量

说明 继续保持思考与尝试 最近挺有意思的&#xff0c;碰到很多技术上的问题&#xff0c;其解决方案都类似“阴阳两仪”的概念。 "阴阳两仪"是中国古代哲学中的一个重要概念&#xff0c;源自《易经》&#xff08;又称《周易》&#xff09;。它是对宇宙间最基本对立统一…

Java数据结构(七)——优先级队列与PriorityQueue

文章目录 优先级队列与PriorityQueue堆基本概念和性质建堆堆的插入堆的删除堆的应用 PriorityQueuePriorityQueue的构造方法PriorityQueue的常用方法PriorityQueue的模拟实现 经典TopK问题 优先级队列与PriorityQueue 优先级队列是一种特殊类型的队列&#xff0c;其中元素按照…

audiocraft - 免费文本转音乐、AI音乐生成、AI音乐创作工具,Facebook开源,本地一键整合包下载

AudioCraft 是一个由Facebook Research开发的PyTorch库&#xff0c;专注于深度学习在音频生成领域的研究。这个强大的工具包集成了两个最新的AI音频生成模型&#xff1a;AudioGen和MusicGen&#xff0c;能够产生高质量的声音和音乐。 今天的一键包也包含了 AudioGen 和 MusicG…

java一键生成数据库说明文档html格式

要验收项目了&#xff0c;要写数据库文档&#xff0c;一大堆表太费劲了&#xff0c;直接生成一个吧&#xff0c;本来想用个别人的轮子&#xff0c;网上看了几个&#xff0c;感觉效果不怎么好&#xff0c;自己动手写一个吧。抽空再把字典表补充进去就OK了 先看效果&#xff1a; …

如何使用Smart-Doc高效生成Java WebSocket接口文档

前言 Smart-Doc 是一款强大的文档生成工具&#xff0c;可以帮助开发者轻松地为Java 项目生成清晰、详细的 API 文档。随着WebSocket技术的普及&#xff0c;Smart-Doc 在3.0.7版本开始也增加了对 WebSocket 接口的支持。本文将详细介绍如何使用 Smart-Doc 生成 Java WebSocket …