一、前言
Spring Boot是一个非常流行的Java后端框架,它可以帮助我们快速高效的构建web应用程序。但是随着应用程序规模的增长,性能也开始变得严重起来。本文将介绍如何在spring boot项目中实现性能优化,以提高应用程序的性能和可靠性。
二、可以做哪些层级的性能优化
性能优化其实是一个很大的话题,包含了几个层级的性能优化:设计优化、代码优化、JVM调优、数据库优化和操作系统优化。当然我们作为开发人员,我们重点关注代码层级的优化,所以我们将会从代码层级的优化去讲解。
三、代码层级可以做哪些优化
1.采用单例
在开发中我们尽量去使用单例模式,以节约系统资源。特别是IO处理,数据库连接等一些非常耗系统资源的操作,我们应强制使用单例。
2.使用缓存
使用缓存包含两个方面,缓存数据和缓存结果。
缓存数据就是将一些不经常变化的数据缓存起来,避免频繁查询数据库减少网络IO和磁盘IO。
而缓存结果则是将计算后的结果缓存起来,比如同一个用户相同的请求的结果缓存起来,下次再有相同的请求我们直接从缓存中拿到这个请求的结果,不用先去数据库查询然后再经过计算后再返回给用户。通过缓存结果可以减少CPU计算资源、网络IO和磁盘IO的消耗。
3.使用异步CompletableFuture
假如一个任务执行起来很耗时或者需要执行多个任务,之前多个任务是串行执行,我们可以让这多个任务异步的并行执行然后汇总执行结果。通过异步执行的方式我们可以省去很多不必要的等待时间。
4.使用线程池
合理的利用线程池能够带来一些意想不到的好处。比如:1)能够降低资源消耗。通过重复利用已经创建好的线程,可以降低重复创建和销毁线程带来的资源消耗。2)可以提高响应速度。当有任务时,不需要等待线程创建就能立即执行。3)提高线程的可管理性。线程是稀缺资源,如果无限制创建会非常消耗我们的系统资源,使用线程池可以对线程进行统一分配、管理和监控。
5.SQL优化
SQL优化是性能优化中经常会遇到的问题,比如有些接口RT过长,经过性能分析和监控平台发现是慢sql的问题,那么我们通常会看这条SQL语句的执行计划,并具体分析是什么原因导致了慢sql。通常来说慢SQL一般可能是一下原因导致的:
- 索引失效
- 索引区分度不高
- 多表join
- 查询字段太多
- 单表数据量太大
- 数据库连接不够了
- 数据库IO或CPU飙高
- 有长事务
- 有锁竞争导致等待
6.锁的优化
在并发场景中,为了解决并发问题,我们会经常使用锁。使用了锁那就存在锁的竞争,就会消耗很多资源,通常我们会从以下几个方便去进行锁优化:
- 减小锁的粒度:比如在并发场景中需要使用Map的时候,尽量使用ConcurrentHashMap来代替HashTable,因为ConcurrentHashMap采用了分段锁,锁的粒度会更小。
- 减少锁的持有时间:我们尽量不要给整个方法加锁,这样持有锁的时间会很长,我们尽量给需要控制并发的代码块加锁。即采用同步代码块来代替同步方法。