2024年开发踩坑记录

20240704 记一次因为使用BeanUtil.copyToList/ BeanUtil.copyProperties导致接口耗时较长问题

最近接手做一些服务性能方面的优化,再优化一个耗时较长的接口时,经过排查后发现是使用了BeanUtil.copyToList/ BeanUtil.copyProperties的原因。

1、排查过程

  1. 接口耗时较长,我常用的思路是先排查查询sql,sql排查后,再排查具体业务逻辑中可能存在耗时的情况,这次也不例外。
  2. 使用了arthas追踪方法耗时,发现大批量的数据库查询方法有五个左右,耗时均在400ms作用,加起来就快2s多了,到这里就没有去继续具体方法里追踪耗时了,因为方法都很简单,就是从数据库里取数,然后做了一个对象转化,都没有具体业务逻辑(以后还是老老实实到具体方法里细查的好);
  3. 直接开始排查sql,sql整出来使用explain分析后发现都用了索引,而且数据库执行查询sql速度也很快,但在业务逻辑中就比较慢;
  4. 这里又走了弯路,我想着既然业务里访问库慢,那么搞一个缓存试一试,项目里使用的是mybatis,然后我结合已有的redis做了个二次缓存,但是效果也很差,基本没区别(因为查询的数据比较少,也就1000多条,走缓存并没有明显的优势);
  5. 继续折腾arthas,看到底是哪里耗时,折腾了好多遍,突然发现列表列出来的耗时想加后,值小于总耗时,一看方法只有俩行代码,一行查询数据库,耗时100ms,另一行是BeanUtil.copyToList转化对象返回,方法总耗时400ms,那么是这个BeanUtil.copyToList操作耗时?直接把第二行代码提取成方法,发现的确是,然后观察整个接口的业务代码,发现使用了大量的BeanUtil.copyToList/ BeanUtil.copyProperties进行数据赋值转化,都抽成方法后,发现这些转化的方法耗时大约占整体耗时的40%左右。
    在这里插入图片描述

2、问题原因

  1. 原因就是使用了BeanUtil.copyToList/ BeanUtil.copyProperties做数据转化的问题,数据转化的两个对象的属性值多且复杂的时候,就会出现这个问题,这里copy是用反射+循环去进行字段赋值,当字段对象也是复杂对象,且包含复杂对象时,就爆炸了,会有大量的时间去处理这些操作。

3、解决方案

  1. 简单粗暴,new一个对象,完事写set方法进行属性赋值,需要花费大量时间;
  2. 用mapstruct插件实现,这个插件会帮助我们实现类型互转,而且使用的是get/set方法的模式,相对与反射来说高效一点

Mapstruct使用注意事项

  1. 若项目中使用了springfox-swagger2依赖,需要排除其内置依赖的mapstruct在这里插入图片描述
  2. 抛出异常 java: Internal error in the mapping processor: java.lang.NullPointerException
    需要做上面的排除操作,然后引入新的mapstruct依赖,我使用的是1.5.5版本
    <org.mapstruct.version>1.5.5.Final</org.mapstruct.version>
    在这里插入图片描述
  3. 抛出异常:java: Internal error in the mapping processor: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
    这个问题是要转化的对象中,存在同名属性,但是类型不一致,举例:ADTO对象中有一个int的age属性,对象AVo中有一个Object类型的age属性,此时会抛出上面的异常(1.3版本),若使用了1.5.5版本,会比较明确抛出是类型不一致的问题;
  4. 使用代码简单案例-Spring框架中
定义一个转化类
@Mapper(componentModel = "Spring")
public interface DtoToVoMapperTransfer {
   AVo dtoToVo(ADTO aDto);
   List<Avo> dtoListToVoList(List<ADTO> aDtoList);
}
@SpringBootTest
public class DtoToVoMapperTransferTest {
    @Resource
    DtoToVoMapperTransfer dtoToVoMapperTransfer;
    
    @Test
    public void mapperStructTest(){
       ADTO aDto = new ADTO();
       AVo aVo = dtoToVoMapperTransfer.dtoToVo(aDto);
    }
}

20240202

Vue脚手架报错–Component name “School“ should always be multi-word解决方法

const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
  lintOnSave:false  //关闭语法检查,开发用
})

20240319 记一次IDEA2022.3.3版本 使用时CPU经常突增100%

最近使用IDEA时,每打开一个大一点的类时,CPU使用就会突增到100%,每次会持续三到五秒,就恢复正常了
敲代码时也会偶然出现,卡的鼠标都移不动,基本就是下面俩图示的情况,啥也看不出来,就是看到一个没定义的线程池在跑,还有就是idea的任务在跑
请添加图片描述
试了很多办法,网上找了很多的方案,都对我不生效,装的插件也比较多,怀疑是某个插件导致的,
因为看不出具体是哪一个插件,我索性全部禁用插件,一个个实验,但还是没卵用
今天突然看到右上角的问题检查每当敲完代码的时候就会刷新一下:
在这里插入图片描述
那么有没有可能是这个的问题,这里会检查当前打开的类,进行一些优化提示,语法提示,还有重复代码的提示
在这里插入图片描述
设置切成第二个时,CPU突增的现象没有了,占用高也就是500~700,我12线程的CPU管够跑了,也没有再出现卡顿现象
如果经常使用都没有问题,也没有装插件,突然就开始卡了,很有可能是这里的问题,
要是插件的原因,可以禁用插件,或者去IDEA的插件问题反馈的github上看看有没有人遇到相同的问题,是如何解决的

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无名一小卒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值