SpringBoot性能优化
前言
最近缺项目经历想快速提升项目实战能力(包含多个AI项目),或者最近找工作,或者想学习AI的小伙伴,可以看看下面👇🏻的这个链接(或许真的能够帮到你)。
对于从事Java开发的我们来说,现在大部分的公司项目都已经在用SpringBoot了。
使用它确实能够帮我们减少Spring项目中的很多配置,提升开发效率。
那么,问题来了,SpringBoot项目的性能要如何优化呢?
今天跟大家一起聊聊这个问题,希望对你会有所帮助。
1 使用数据库连接池
我们在SpringBoot项目中,经常需要连接数据库。
传统的做法是这样的,在application.properties文件中增加如下配置:
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver但传统数据源的方式,性能不太好。
创建和销毁数据库连接是非常耗时的操作,传统的数据源需要不断创建和销毁数据库连接。
Spring Boot默认集成了HikariCP作为数据库连接池,我们可以通过配置来优化其性能。
spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.max-lifetime=18000002 使用缓存
有时候,我们需要在代码中使用二级缓存,即内存缓存,提升代码的性能。
这时候可以直接使用Spring Cache功能。
Spring Boot提供了缓存支持,通过添加@EnableCaching注解来启用。
然后在需要使用缓存的地方,增加@Cacheable注解。
@SpringBootApplication
@EnableCaching
public class ApiApplication {
public static void main(String[] args) {
SpringApplication.run(ApiApplication.class, args);
}
}
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
@Cacheable("users")
public List<User> getAllUsers() {
return userMapper.findAll();
}
}调用getAllUsers方法时,会先从users的缓存中获取数据,如果数据存在,则直接返回。
如果不存在,则调用userMapper.findAll()方法获取数据,然后添加到缓存中,最后返回。
3 使用异步
为了系统程序的并发能力,减少等待时间,SpringBoot还提供了异步处理能力。
需要使用先@EnableAsync注解,整体开启异步功能。
然后在需要异步处理的方法上,加上@Async注解。
@SpringBootApplication
@EnableAsync
public class ApiApplication {
public static void main(String[] args) {
SpringApplication.run(ApiApplication.class, args);
}
}
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
@Async
public List<User> getAllUsers() {
return userMapper.findAll();
}
}@Async注解默认会开启一个线程,去执行异步逻辑。
最近缺项目经历想快速提升项目实战能力(包含多个AI项目),或者最近找工作,或者想学习AI的小伙伴,可以看看下面👇🏻的这个链接(或许真的能够帮到你)。
如果异步任务太多,可能会开启大量的线程,导致系统的稳定性下降。
因此,我们在使用@Async注解实现异步的时候,最好配置一个线程池。
合理配置线程池的大小和参数,避免线程过多导致的资源浪费和性能下降。
例子配置(在application.properties中配置):
spring.task.execution.pool.core-size=8
spring.task.execution.pool.max-size=10
spring.task.execution.pool.queue-capacity=1004 JVM参数
JVM参数设置可以显著影响应用的性能。
通过调整堆内存大小、垃圾回收策略等参数,可以减少GC时间和提高内存利用率。
例子配置(在application.properties或JVM启动参数中设置):
-Xms1g -Xmx2g -XX:+UseG1GC5 启用Gzip压缩
我们有些查询接口,可能会一次性返回大量的数据,导致接口性能下降。
我们通过启用Gzip压缩,可以减少HTTP响应的大小,提高传输效率。
例子配置(在application.properties中设置):
server.compression.enabled=true
server.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain6 调整Tomcat的配置
SpringBoot使用的默认嵌入式Web容器是Tomcat。
我们可以调整 Tomcat 的配置,如最大线程数、连接超时时间等,以提高吞吐量。
server.tomcat.max-threads=200
server.tomcat.accept-count=100
server.tomcat.connection-timeout=200007 使用HTTP/2
SpringBoot支持HTTP/2,可以通过配置启用,提供更好的性能和资源利用。
server.http2.enabled=true8 减少应用启动时间
有时候,我们的SpringBoot项目在启动的时候,需要加载大量的配置类,影响启动速度。
使用 @SpringBootApplication 中的 exclude 属性排除不必要的自动配置类。
避免使用过多的自动扫描和自动装配,尽量手动配置需要的 Bean。
最近缺项目经历想快速提升项目实战能力(包含多个AI项目),或者最近找工作,或者想学习AI的小伙伴,可以看看下面👇🏻的这个链接(或许真的能够帮到你)。