提高后端接口性能的方法

个人bibilailai(不喜请跳过):前几天参加的部门技术分享会,同事分享了一个内容为“提高接口性能的常见技巧”,个人觉得很有用,所以想在这里分享给大家,希望对刚入职场不久的兄弟姐妹们有所帮助。

1.避免大事物

大事务:有事务的方法的运行时间比较长,长时间未提交的事务。

1.1 大事务产生的原因

  • 操作的数据比较多
  • 大量的锁竞争
  • 事务中有其他非DB的耗时操作

1.2 大事务造成的影响

  • 并发情况下,数据库连接池容易被撑爆
  • 锁定太多的数据,造成大量的阻塞和锁超时,甚至导致死锁
  • 执行时间长,容易造成主从延迟
  • 回滚所需要的时间比较长
  • undo log膨胀

1.3 例子

反例:

@Transactional(rollbackFor=Exception.class)public void save(Req req) {checkParam(req);saveData1(req);updateData2(req);}private void checkParam(Req req){Data1 data = selectData1();Data2 data2 = selectData2();if(data.getSomeThing() != STATUS_YES){throw new BusinessTimeException(.....);}}

优化思路:一般只需要把与数据库的插入和修改操作放在事务里面,其他的校验以及查询数据等等都不需要放在事务内。

正例:

class ServiceAImpl implements ServiceA {@Transactional(rollbackFor=Exception.class)public void save(Req req) {saveData1(req);updateData2(req);}private void checkParam(Req req){Data1 data = selectData1();Data2 data2 = selectData2();if(data.getSomeThing() != STATUS_YES){throw new BusinessTimeException(.....);}}public void save(Req req){checkParam(req);doSave(req);}
}

2.异步调用

同步调用:也就是在你写的代码里面,在方法内部,必须按照从上往下的顺序执行,如果中间某一步报错了,就不能继续往下面执行了,全程只有一个主线程在执行。

异步调用:会在异步调用处启动另外一个线程1来执行被一步标记的那一步,全程有两个线程,除了线程1还有一个主线程,这两个线程是完全分开的,即使线程1报错也不会影响主线程的执行。

一般情况要看具体业务的时效性以及具体功能的必要性,比如注册会员,一般情况下会先修改用户数据,然后给用户发放100的奖励积分,其中对于发放积分这个操作就可以异步执行。

实现异步调用的方式有很多,这里就不赘述了。

3.添加索引

为表添加适当的索引,大家可以参考我这篇文章:写文章-CSDN创作中心icon-default.png?t=O83Ahttps://mp.csdn.net/mp_blog/creation/editor/140501342

4.避免循环查数据库

开发是要尽量减少与数据库的交互,因为和数据库交互非常耗时,影响性能。

如下反例:

 @Overridepublic List<Account> getAccountList(List<String> ids) {List<Account>  accounts = new ArrayList<>();for (String id : ids) {Account account = mapper.selectById(id);accounts.add(account);//其他业务操作}return accounts;}

正例:直接一次性查出需要的所有数据:

  @Overridepublic List<Account> getAccountList(List<String> ids) {List<Account> accounts = mapper.selectBatchIds(ids);return accounts;}

5.避免无限递归

特别是在不确定递归深度的时候,最好不要递归循环查数据库。

和上述避免循环查数据库是一样的道理。

方法有如下:

1.设定递归深度(也就是确定递归的次数)。

2.先查出所有的数据,然后去数据列表中筛选。

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

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

相关文章

解决CentOS7 yum update异常:Could not retrieve mirrorlist

报错 Could not retrieve mirrorlist http://mirrorlist.centos.org/?release7&archx86_64&repoos&infrastock error was 14: curl#6 - "Could not resolve host: mirrorlist.centos.org; Unknown error" 解决 执行命令&#xff1a;切换目录&#xff0…

Mybatis查询数据库,返回List集合,集合元素也是List。

#有时间需求会要求&#xff1a;查询全校的学生数据&#xff0c;且学生数据按班级划分。那么就需要List<List<user>>类型的数据。 SQL语句 SELECT JSON_ARRAYAGG(JSON_OBJECT(name , name ,BJMC, BJMC ,BJBH,BJBH)) as dev_user FROM dev_user WHERE project_id …

Linux:防火墙和selinux对服务的影响

1-1selinux 1-1 SELinux是对程序、文件等权限设置依据的一个内核模块。由于启动网络服务的也是程序&#xff0c;因此刚好也 是能够控制网络服务能否访问系统资源的一道关卡。 1-2 SELinux是通过MAC的方式来控制管理进程&#xff0c;它控制的主体是进程&#xff0c;而目标则是…

论文阅读笔记Dense Passage Retrieval for Open-Domain Question Answering

前言 在开放域的问答系统中&#xff0c;我们需要从大量的文本数据中搜索匹配我们想要的答案&#xff08;或者学习文档的“信息知识”用于生成答案&#xff09;&#xff0c;而对每个问题都进行全文的数据“学习”是不现实的&#xff0c;因此往往依赖于高效的文本检索来选择候选…

书生大模型第四期 | L0G3000 git 基础知识

1、破冰行动 fork项目 PR链接&#xff1a;跳转访问 https://github.com/InternLM/Tutorial/pull/21632、构建个人项目 创建一个仓库保存LLM学习的笔记&#xff0c;以md文件为主 博客页面项目

List 列表基础用法

List 列表基础用法 列表可以完成大多数集合类的数据结构实现。列表中元素的类型可以不相同&#xff0c;它支持数字&#xff0c;字符串甚至可以包含列表&#xff08;所谓嵌套&#xff09;。 列表是写在方括号 [] 之间、用逗号分隔开的元素列表。 和字符串一样&#xff0c;列表…

从0开始学PHP面向对象内容之(类,对象,构造/析构函数)

上期我们讲了面向对象的一些基本信息&#xff0c;这期让我们详细的了解一下 一、面向对象—类 1、PHP类的定义语法&#xff1a; <?php class className {var $var1;var $var2 "constant string";function classfunc ($arg1, $arg2) {[..]}[..] } ?>2、解…

详细记录555定时器组成和工作原理(第一篇)

目录 一、创作灵感 二、CB555的电路结构图 1、比较器C1和C2 2、三个5KΩ串联组成的分压电路 3、由与非门G1和G2组成的SR锁存器 4、G3、G4、集电极开路的放电三极管TD 三、CB555引脚功能 1、CB555引脚功能描述 2、CB555的功能表 四、CB555施密特触发器 1、施密特触发器…

Linux_02 Linux常用软件——vi、vim

vi编辑器有三种主要模式&#xff0c;每种模式的功能和用途不同&#xff1a; 一、命令模式 (Command Mode)&#xff1a; - 启动 vi 时默认进入此模式。 - 你可以在此模式下移动光标&#xff0c;输入各种命令&#xff08;如删除、复制、粘贴等&#xff09;。 yy&#xff1a;…

C#与C++交互开发系列(十八):跨进程通信之命名管道(Named Pipes)

1、前言 在 C# 和 C 应用程序之间进行数据交换时&#xff0c;命名管道&#xff08;Named Pipes&#xff09;是一种简单高效的进程间通信&#xff08;IPC&#xff09;方式。命名管道提供了可靠的双向通信通道&#xff0c;适合用于同一台机器上的跨进程通信。本文将深入介绍如何…

uniapp的video视频属性打包app后层级过高

问题&#xff1a;在使用uniapp开发APP时&#xff0c;使用video标签显示视频发现H5可以正常展示&#xff0c;但是打包到APP后&#xff0c;它的层级过高&#xff0c;把底部导航都盖住了。 官网说明&#xff1a;uni-app官网 官网给了cover-view组件或plus.nativeObj.view、subNVue…

【linux 多进程并发】0302 Linux下多进程模型的网络服务器架构设计,实时响应多客户端请求

0302 多进程网络服务器架构 ​专栏内容&#xff1a; postgresql使用入门基础手写数据库toadb并发编程 个人主页&#xff1a;我的主页 管理社区&#xff1a;开源数据库 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物. 一、概…

SQLI LABS | Less-26 GET-Error Based-All Your SPACES And COMMENTS Belong To Us

关注这个靶场的其它相关笔记&#xff1a;SQLI LABS —— 靶场笔记合集-CSDN博客 0x01&#xff1a;过关流程 输入下面的链接进入靶场&#xff08;如果你的地址和我不一样&#xff0c;按照你本地的环境来&#xff09;&#xff1a; http://localhost/sqli-labs/Less-25/ 本关考察…

XML标记语言

最近在学XXE-XML外部实体注入漏洞时候&#xff0c;浅浅学习了一下XML&#xff0c;谨做此学习笔记。 目录 一&#xff1a;XML概述 二&#xff1a;XML语法 XML中的CDATA 三&#xff1a;使用PHP解析XML文档 添加节点 四&#xff1a;Xpath语言 绝对查找 相对查找 使用*匹配…

详解:模板设计模式

模板设计模式&#xff08;Template Pattern&#xff09;是一种行为设计模式&#xff0c;在软件设计中有着广泛的应用&#xff0c;旨在提高代码的可维护性和可复用性。 一、定义与特点 定义&#xff1a; 模板设计模式定义了一个算法的骨架&#xff0c;将某些步骤推迟到子类中实…

《向量数据库指南》——RAG质量评估与监控,打造高效AI引擎

嘿,各位向量数据库的小伙伴们,我是你们的老朋友王帅旭,大禹智库的向量数据库高级研究员,也是那本被大家津津乐道的《向量数据库指南》的作者。今天咱们来聊聊一个特别重要但又经常被忽视的话题——质量评估与监控,这可是确保咱们RAG(检索增强生成)系统稳定高效运行的关键…

Verilog HDL基础

模块的基本结构 module 模块名(端口列表); // 模块声明// 端口定义input [数据类型] [位宽] 输入端口列表; output [数据类型] [位宽] 输出端口列表; inout [数据类型] [位宽] 双向端口列表; // 数据类型定义wire [位宽] 线网名,线网名&#xff0c;…; …

HarmonyOS NEXT 应用开发实战(九、知乎日报项目详情页实现详细介绍)

在本篇博文中&#xff0c;我们将探讨如何使用 HarmonyOS Next 框架开发一个知乎日报的详情页&#xff0c;逐步介绍所用到的组件及代码实现。知乎日报是个小巧完整的小项目&#xff0c;这是一个循序渐进的过程&#xff0c;适合初学者和有一定开发经验的工程师参考。 1. 项目背景…

SpringBoot+FileBeat+ELK8.x版本收集日志

一、准备环境 1、ElasticSearch&#xff1a;8.1.0 2、FileBeat&#xff1a;8.1.0 3、Kibana&#xff1a;8.1.0 4、logstach&#xff1a;8.1.0 本次统一版本&#xff1a;8.1.0,4个组件&#xff0c;划分目录&#xff0c;保持版本一致。 说明&#xff1a;elasticsearch和kib…

UML介绍-不同类间关系

目录 不同的类间关系有着各自独特的体现方式。 继承关系 实现关系 关联关系 聚合关系 组合关系 数据库建模PowerDesigner UML&#xff08;Unified Modeling Language&#xff09;即统一建模语言&#xff0c;是一种用于软件系统分析、 设计和文档编制的可视化建模语言。…