Java后台服务慢优化杂谈
Java后台服务慢优化杂谈
前言
你是否遇到过这样的场景,当我们点击页面某个按钮后,页面一直loading,要等待好几分钟才出结果的画面,有时直接502或504,作为一个后台开发,看到自己开发的系统是这个样子,就问你惭愧吗。
这种问题其实是性能问题,当用户量少数据少的时候,处理还是很快的,数据量一旦大起来,后台处理时间就会延长,前端大部分直接超时或无限等待直接死掉。
方案
解决数据量大的性能问题,要根据实际业务场景来针对分析。但归根结底,只有一条最终方案,即减少与数据库交互次数,尤其是在for循环里面。我们所有慢的场景,按这个方式优化,之前好几分钟,十几分钟的功能都优化到了3秒内。
For循环内查询数据库优化
我们很多场景如新增,修改,上传,下载报表,都会有for循环内查询数据库的操作,而且一次循环有的与数据库要交互好次操作,这样下来如果循环是以用户列表来处理的,一个租户下1000个用户,每个用户要与数据库交互几次,再乘以1000,想想得多耗时。
这种场景的优化很简单,直接将循环体内与数据库的交互全部拿到循环外,通过业务逻辑,表结构关系是可以做到的,然后在循环体内只做内存计算,实验证明,循环体内与数据库交互的次数越少,耗时越小,可能有人会那你循环体内Java处理也慢啊,非也,Java纯内存处理其实一点都不慢。
- //声明for循环处理结果集
- List<?> list = new ArrayList<>();
- //循环前提前向数据库查询要用到的数据
- List<?> userList = userMapper.selectList(xxx);
- for(User user: userList){
- //处理单个用户业务逻辑,避免多次查库
- list.add(xxx);
- }
For循环内修改数据库优化
上面说的是循环体内查询数据库,这里要说的场景就是循环体内插入或修改数据库记录,还是1000个用户循环插入或修改关联表,与数据库的交互次数也庞大的,这里的优化也很简单,将要变更到数据库对象全部封装到集体中,循环处理完成后 ,再一次性或分批将集合数据插入数据库,这也会大大提高修改操作的性能的。
- //定义待插入数据库的集合
- List<User> list = new ArrayList();
- for(User u : userList){
- //处理待插入数据库的User对象
- list.add(u);
- }
- //批量(也可以设置分批次)插入数据库
- userMapper.batchInsert(list);
多线程并发处理
增加线程池这种优化方案就不用多说了吧
- threadPoolTaskExecutor.submit(()->{
- try {
- //业务逻辑处理
- } catch (Exception e) {
- }
- });
缓存
在以上业务代码优化完毕,如果还要再提升性能,那就可以对多查询的业务加缓存处理,如Redis,Memcached。
异步
缓存也加了,并发性能还上不来,就可以使用异步处理了,将请求放入消息队列MQ,然后多线程异步消费队列处理请求。
服务器集群
在生产环境一般都不会是单节点部署,要保障系统稳定性肯定是要多节点部署,这也能在优化代码代码的基础上提高并发性能,尤其是当使用中间件如缓存,MQ,更是要使用多节点集群,才能发挥中间件的作用,如上篇 Redis+Kafka异步提高并发,可以将接口并发能力提升到3000-5000QPS。
作者介绍:小林,狐小E资深开发工程师,专注移动协同办公平台的SAAS软件开发以及轻应用开发
最近开发了一款移动办公软件 狐小E
Java后台服务慢优化杂谈的更多相关文章
- android支付宝app支付(原生态)-包括android前端与java后台
本文讲解了 android开发的原生态app集成了支付宝支付, 还提供了java后台服务器处理支付宝支付的加密代码, app前端与java后台服务器使用json数据格式交互信息,java后台服务主要用 ...
- android 集成支付宝app支付(原生态)-包括android前端与java后台
本文讲解了 android开发的原生态app集成了支付宝支付, 还提供了java后台服务器处理支付宝支付的加密代码, app前端与java后台服务器使用json数据格式交互信息,java后台服务主要用 ...
- 【JavaService】部署Java jar为Windows后台服务
将Java jar文件部署为Windows后台服务有多种方法:Service Installer.Java service Wrapper.JavaService.exe等等.这里介绍下使用JavaS ...
- 将java打jar包成linux后台服务service
将java打jar包成linux后台服务service 第一步:将java程序打成jar包 build.gradle配置文件中加spring-boot-gradle-plugin插件,具体配置如下(配 ...
- 【POI】java服务生成List数据集合,后台服务生成xlsx临时文件,并将临时文件上传到腾讯云上
场景: java服务生成List数据集合,后台服务生成xlsx临时文件,并将临时文件上传到腾讯云上 今日份代码: 1.先是一个变量,作为文件名 private static final String ...
- 如何用CropBox实现头像裁剪并与java后台交互
如何用CropBox实现头像裁剪并与java后台交互 参考网站:https://developer.mozilla.org/zh-CN/docs/Web/API/Blob 参考: http://blo ...
- 非科班双非本科投的337家Java后台(励志)
考试结束,班级平均分只拿到了年级第二,班主任于是问道:大家都知道世界第一高峰珠穆朗玛峰,有人知道世界第二高峰是什么吗?正当班主任要继续发话,只听到角落默默想起来一个声音:”乔戈里峰” 前言 文章出自h ...
- Java后台面试记录
腾讯一面: 总结:考基础和代码(网址A是不是网址B的子域) + SQL(选出重复邮箱)(以下是没回答上来的) 逻辑回归公式(简历上写了协同过滤) 详见:https://blog.csdn.net/ma ...
- Android 三级联动选择城市+后台服务加载数据库
技术渣,大家将就着看 首先我们需要一个xml数据保存到数据库,这里我从QQ下面找到一个loclist.xml文件 <CountryRegion Name="中国" Code= ...
随机推荐
- 接口工具Apifox
最近发现一款接口测试工具--apifox,我我们很难将它描述为一款接口管理工具 或 接口自测试工具. 官方给了一个简单的公式,更能说明apifox可以做什么. Apifox = Postman + S ...
- Python编程基础(一)编程语言是什么?编译型语言和解释型语言的区别|Python是什么?
编程语言是什么? 其实,程序指的就是一系列指令,用来告诉计算机做什么,而编写程序的关键在于,我们需要用计算机可以理解的语言来提供这些指令. 虽然借助 Siri(Apple).Google Now(An ...
- windows:进程查杀
windows平台中,某些进程做了各种保护,比如hook了terminateProcess,又或者注册了进程终止函数的回调.当调用这些API或任务管理器终止该进程时,会被绕过,典型如某些杀毒软件,怎么 ...
- ElasticSearch添加索引
1. 编写索引内容 节点解释: settings:配置信息 "number_of_replicas": 0 不需要备份(单节点的ElasticSearch使用) "ma ...
- JsLint undeclared ‘window’
如果使用IDEA 设置一下 globals 或 /*global window */ ... your script goes here https://stackoverflow.com/quest ...
- 如何设置远程MongoDB!
默认情况下V服务连接着本地mongoDB服务,如果想连接到其他mongoDB服务,请按如下设置: 方法一:通过控制台修改 进入控制台 http://x.x.x.x:xxxx/system/consol ...
- SpringMVC 集成 JWT验证方式
JWT官网: https://jwt.io/ 这里以java的ssm框架为例,集成jwt. 1.pom.xml 导入jwt的包 <!-- jwt --> <dependency> ...
- myBatis源码解析-数据源篇(3)
前言:我们使用mybatis时,关于数据源的配置多使用如c3p0,druid等第三方的数据源.其实mybatis内置了数据源的实现,提供了连接数据库,池的功能.在分析了缓存和日志包的源码后,接下来分析 ...
- Springboot开启事务的支持
主要分为两步 步骤一.在main方法加上@EnableTransactionManagement注解: @SpringBootApplication @EnableTransactionManagem ...
- ECS7天实践进阶训练营Day5:使用ECS自建云端下载服务器
一.概述 CCAA是服务器离线下载解决方案包,其组件中包含了Aria2提供了离线下载功能,能支持HTTP/HTTPS/FTP/BT/磁力链下载等常用离线下载模式及断点续传等功能.ccaa_web支撑于 ...