Spring Data JPA 性能优化之 findAll

优化场景描述

当时是测试环境,进行一个列表的初始化分页查询,pageSize 为8(已经很小了),页面的数据项也很少,就那么几个信息,但是性能压测通过不了。

提出性能问题假设

事关性能问题,我们不妨大胆的假设:

  • pageSize只有8,会不会是返回的数据包含的信息量太大,网络IO顶不住?
  • 接口会不会有第三方的调用,有等待延迟?
  • 接口内部的查询逻辑会不会过于复杂,需要多表且多次查询?
  • 数据库数据量太大,查询是否命中索引或是否需要索引?
  • 查询的SQL语句是否有不合理需要优化的地方?

按假设逐一排查

1、pageSize只有8,会不会是返回的数据包含的信息量太大,网络IO顶不住?

在查询页面,打开F12,查看接口的返回数据,不难发现返回的List列表里面层层嵌套了不少List列表(案例只嵌套了一层,不过有3个嵌套),且嵌套在内部的数据量还不小。

结论:有可能是信息量太大

2、接口会不会有第三方的调用,有等待延迟?

进入接口内部,没有发现第三方的调用,就不存在等待延迟。

结论:排除可能。

3、接口内部的查询逻辑会不会过于复杂,需要多表且多次查询?

进入接口内部,逻辑很清晰,就是一个单表的分页查询。

结论:排除可能。

4、数据库数据量太大,查询是否命中索引或是否需要索引?

测试环境的数据量算很小了,索引不索引的,不应该是影响性能的主要原因。

结论:排除可能。

5、查询的SQL语句是否有不合理需要优化的地方?

接口采用的Spring Data JPA 的findAll 分页查询,属于JPA的东西,应该不会有太大的性能问题吧。

结论:JPA的findAll 查询有可能有性能问题

那么最有可能的就是1和5了,那就进一步排查。

因为返回值存在List的层层嵌套,而接口又是一个单表查询,这是不是有点矛盾?那么朝矛盾点进发,打开对应的类对象,仔细一看,好家伙,嵌套的List 对象上各自添加了 @OneToMany、@ManyToMany、@ManyToOne 注解,注解让我们查询的表与其他表进行了级联操作。findAll 方法会去查询关联表的信息。3个级联关系,再查询3次SQL,性能差距也不能这么差吧。于是我再去看findAll 方法执行时的日志,不看不知道,一看吓一跳。findAll 方法执行了很多次的查询,经我观察发现,关联表相关的数据量越大,查询的次数就越多(根源问题找到了:SQL的多次执行)。

结论:因为对象的级联关系,导致 findAll 会自动查询关联表(多次查询)的信息并进行数据封装,导致数据库压力大,造成性能问题。

优化分析

  • 从业务需求方面:
    是否需要级联查询的关联数据,如果不需要,去掉级联查询。

  • 从网络IO方面:
    返回的冗余数据量过多,需要剔除冗余数据量。

  • 从SQL方面:
    发现findAll 方法会因为关联数据增多,而新增查询语句,导致多次查询。因此决定自行写SQL。

  • 从缓存方面:
    如果没有冗余数据,也采用了SQL优化的方法,但还是慢,则要考虑redis缓存了。

解决措施

  • 从业务需求方面:
    List的嵌套数据确实是多余的,可以去掉级联查询到的多余List。

  • 从网络IO方面:
    返回值对象重新封装一下,只返回需要返回的数据。

  • 从SQL方面:(分页查询返回的Page)
    采用 nativeQuery = true 自行编写sql的方式,但是不能返回 Page,这样会触发级联查询。因此用 Page<Map<String, Object>> 对象接受查询的返回值(跟踪日志发现,接口查询只进行了一次SQL查询),并做map 的List处理, 用JSON.parseArray(JSON.toJSONString(List对象), 类对象名.class) 处理得到想要的List对象。

小结:当类对象存在 @OneToMany、@ManyToMany、@ManyToOne 等注解时,要特别注意,findAll(@Nullable Specification var1, Pageable var2) 返回的 Page< T > 会自行进行级联查询并数据封装。使用自定义的查询(nativeQuery = true)并返回 Page<Map<String, Object>> 对象就可以避免级联查询。

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

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

相关文章

【unity中使用高度图创建地图】

unity中使用高度图创建地图 插件 讲解案例为unity2022版本 这个是插件地址 也可以在资源商店中搜索 terrain-tools 介绍 Terrain Tools入门Terrain Tools是一个软件包&#xff0c;你可以选择将其添加到Unity 2019.1或更高版本中的任何项目中。要将该软件包添加到你的项目…

linux中shell的流程和循环控制

流程控制和循环控制 shell流程控制流程注意条件结构数值比较文件测试字符串比较 if语句单分支结构双分支结构多分支结构嵌套结构 case语句格式 shell循环控制for循环while循环until循环expect交互shell循环控制 shell流程控制 任何编程都离不开判断&#xff08;流控&#xff09…

准备好通过 “Breakin’ B.I.G.” 在嘻哈音乐界大放异彩吧!

在 The Sandbox 推出人物化身系列后&#xff0c;是时候通过 “Breakin’ B.I.G.” 重返嘻哈音乐的黄金时代了。该体验于 12 月 20 日推出&#xff0c;一直持续到 1 月 3 日&#xff0c;让玩家回到 20 世纪 90 年代&#xff0c;体验以 Notorious B.I.G 为主角的 2D 街舞游戏。 获…

初始Web服务器

一、web服务器 1、什么是web服务器&#xff1f; web服务器就是web项目的容器&#xff0c;我们将开发好的web项目部署到web容器中&#xff0c;才能使用网络中的用户通过浏览器进行访问。 一张图带你了解web服务器有啥作用&#xff1a; 在我的电脑上有一个已经做好的项目&#…

网络通信-入门1

网口框架 100M 2. 物理层解读 2.1 同步的方法&#xff1a;编码 为了让接收方在没有外部时钟参考的情况也能确定每一位的起始、结束和中间位置&#xff0c;在传输信号时不直接采用二进制编码。在 10BASE-T 的传输方式中采用曼彻斯特编码&#xff0c;在 100BASE-T 中则采用 4B/…

分布式技术之流量控制技术

文章目录 什么是流量控制&#xff1f;分布式系统流量控制策略漏桶策略令牌桶策略两种策略对比Sentinel 流量控制工作原理 什么是流量控制&#xff1f; 流量控制&#xff0c;如果学过计算机网络的话&#xff0c;第一反应肯定是网络传输中的流量控制。网络传输中的流量控制&…

家政行业的小程序都需要具备哪些功能?

家政服务小程序&#xff0c;覆盖多城&#xff0c;在线派单 适合行业&#xff1a;家电维修、家政保洁、养生护理、美容美发、预约服务上门等 系统功能&#xff1a;服务管理、商品管理、拼团/秒杀、订单管理、会员管理、派单管理、师傅管理、商家/服务点、财务管理、城市代理、次…

arkts中@Watch监听的使用

概述 Watch用于监听状态变量的变化&#xff0c;当状态变量变化时&#xff0c;Watch的回调方法将被调用。Watch在ArkUI框架内部判断数值有无更新使用的是严格相等&#xff08;&#xff09;&#xff0c;遵循严格相等规范。当在严格相等为false的情况下&#xff0c;就会触发Watch的…

总结项目中oauth2模块的配置流程及实际业务oauth2认证记录(Spring Security)

文章目录 简单示例添加oauth2的依赖配置认证服务器配置资源服务器配置安全使用http或者curl命令测试 实际业务中工具类&#xff08;记录&#xff09;&#xff1a;认证服务器资源服务器、配置安全用户验证登录控制层配置文件application.yml 项目中用过的spring security&#x…

Apollo自动驾驶系统:实现城市可持续交通的迈向

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 ChatGPT体验地址 文章目录 前言引言&#xff1a;1. 什么是微服务架构&#xff1f;2. 微服务架构的组成要素3. 微服务架构的挑战和解决方案4. 微服务架构的可扩展性和弹性 第二部分&#x…

ACW741.斐波那契额数列

输入整数 N&#xff0c;求出斐波那契数列中的第 N项是多少。 斐波那契数列的第 0项是 0&#xff0c;第 1项是 1&#xff0c;从第 2 项开始的每一项都等于前两项之和。输入格式 第一行包含整数 T&#xff0c;表示共有T个测试数据。接下来 T行&#xff0c;每行包含一个整数 N。输…

LeetCode刷题--- 黄金矿工

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 ​​​​​​http://t.csdnimg.cn/6AbpV 数据结构与算法 ​​​​http://t.csdnimg.cn/hKh2l 前言&#xff1a;这个专栏主要讲述…

【Proteus仿真】【STM32单片机】自动除湿器系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真STM32单片机控制器&#xff0c;使用按键、LCD1602液晶、DHT11温湿度、继电器除湿模块等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示DHT11传感器检测的湿度值阈值…

10-2 HNCST - 多线程4 - 线程同步Condition——python

有一家店铺里有4个销售和2个搬运工&#xff0c;销售负责卖货&#xff0c;搬运工负责从仓库搬货物&#xff0c;已知该店铺的存货有size&#xff0c;当销售或搬运工做完所有商品数量后&#xff0c;他们各自就可以下班。销售可以同时卖货&#xff0c;但只能按照货架顺序每次卖出一…

基于SpringBoot的客户关系管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SpringBoot的客户管理系统,java项目…

[JS设计模式]Prototype Pattern

Prototype pattern Prototype pattern可便于同类型的多个对象共享属性。原型&#xff08;prototype&#xff09;是JS原生的对象&#xff0c;其他对象可以通过原型链&#xff08;prototype chain&#xff09;来访问原型。单独看这句描述可能还是有点儿抽象&#xff0c;下面通过…

深度解析ShardingJDBC:Java开发者的分库分表利器

一、ShardingSphere ShardingSphere 是一款起源于当当网内部的应用框架。2015年在当当网内部诞 生&#xff0c;最初就叫ShardingJDBC 。2016年的时候&#xff0c;由其中一个主要的开发人员张亮&#xff0c; 带入到京东数科&#xff0c;组件团队继续开发。在国内历经了当当网、电…

Unity 新版 Meta XR SDK 无法导入解决方法

文章目录 &#x1f4d5;教程说明&#x1f4d5;新版 SDK 说明&#x1f4d5;从 Meta 官网导入开发包⭐依赖包⭐如何导入⭐导入后包存放在哪里了&#xff1f;⭐场景样例文件去哪了&#xff1f; 此教程相关的详细教案&#xff0c;文档&#xff0c;思维导图和工程文件会放入 Spatia…

报表控件FastReport VCL 中的新 S3 传输 (Amazon)

在本文中&#xff0c;我们将探讨新的 S3 传输。从功能上来说&#xff0c;S3 与大多数人习惯使用的有很大不同&#xff0c;因此在本文的开头&#xff0c;我们将详细介绍它的主要功能。 FastReport .NET 是适用于.NET Core 3&#xff0c;ASP.NET&#xff0c;MVC和Windows窗体的全…

软件测试/测试开发丨Python内置库学习笔记

内置库 一、内置库OS 1、os概述 os: Operating Systemos 模块的常用功能跨平台的差异 2、os使用 导入 os 模块查看 os 模块使用文档 help(os)dir(os) import os# 查看os模块说明文档 help(os)# 查看os模块的属性和方法 print(dir(os))3、os 常用方法 &#xff08;1&…