Spring Boot 2.1.1+Java8迁移至3.0.2+Java17后性能问题求助
Spring Boot 3.0.2 + Java 17 迁移后性能问题排查求助
原本使用Spring Boot 2.1.1搭配Java 8时无性能问题,迁移至Spring Boot 3.0.2搭配Java 17后出现性能问题,恳请协助排查原因。
数据获取核心代码
public Iterable<DTO> findById(Integer id, MultiValueMap<String, String> filterParams, Pageable pageable) throws Exception { Page<MODEL> list= repo.findAll(Specification.doFilter(id, filterParams), pageable); List<DTO> casDto = list.stream().map(xref -> DtoMapper.convertDto(xref.getContact(), campaignId)).collect(Collectors.toList()); return new PageImpl<>(casContactsDto, pageable, casprContactCampaignRefList.getTotalElements()); }
Specification过滤逻辑代码
public static Specification<MODEL> doFilter(Integer campaignId, MultiValueMap<String, String> filterParams) { return (root, query, cb) -> { return Specification.where(isActiveInCampaign(campaignId)) .and(hasNumTouches(filterParams.get("number_of_touches"))) .and(hasPrivacyRules(filterParams.get("privacy_rules"))) .and(hasContactValue(filterParams.get("wksp_contact"), "fullName")) .and(hasContactValue(filterParams.get("wksp_account"), "companyName")) .and(hasContactValue(filterParams.get("wksp_primary_ae"), "primaryAE")) .and(hasContactValue(filterParams.get("wksp_email_address"), "emailAddress")) .toPredicate(root, query, cb); }; }
排查方向建议
- SQL生成差异检查:Spring Boot 3.x对应Spring Data JPA版本升级,可能导致Specification生成的SQL逻辑变化。开启JPA SQL日志(配置
spring.jpa.show-sql=true、spring.jpa.properties.hibernate.format_sql=true),对比两个版本生成的SQL,重点看是否出现全表扫描、关联查询效率下降、分页逻辑异常等情况。 - JVM性能监控:Java 17默认GC(G1GC)参数有调整,可通过
jstat、jvisualvm监控GC停顿时间、吞吐量,对比Java 8下的表现。另外,JPMS模块系统可能影响类加载耗时,可检查启动及运行时的类加载情况。 - DTO转换性能测试:单独测试
DtoMapper.convertDto方法的执行耗时,排查是否在Java 17下该方法本身变慢,或者Stream转换过程中存在不必要的对象创建、重复计算等问题。 - 依赖版本兼容验证:Spring Boot 3.x升级了Hibernate到6.x版本,其查询解析、缓存机制有较大改动。检查二级缓存配置是否在新版本中失效,查询缓存是否正常启用,是否出现缓存命中率下降的情况。
- 分页逻辑校验:确认
PageImpl构造参数是否正确,新版本中分页参数的处理是否有变化,是否出现额外的count查询或count查询效率骤降的问题。
内容的提问来源于stack exchange,提问作者Nayaz JH
相关产品推荐
相关产品推荐

