BeanCopy和BeanCopier在实际开发中的使用(属性copy效率优化)

优化场景:

项目的实体类主要分为三种:dto、dao、query等,所以属性copy避免不了,是影响代码执行效率的主要方面之一。
当时的情况是,项目A接受url请求,然后会调用项目B的一个接口去处理明细数据(参数传递主数据,一条主数据对应多条明细数据),项目B处理数据的过程中涉及到属性的copy,而且是循环处理的(循环主数据),当项目A传入项目B的主数据比较多时,那么项目B处理的时间就比较长,而我们这边的服务与服务之间的调用是有时间限制的(我们这是30秒,一个接口处理时间超过30秒已经很长了,用户体验绝对是很差的),所以就会抛出超时的异常。
经过接口监控排查,发现耗时最长的地方就是属性的copy。

优化的解决方案:

1、使用BeanCopier替换BeanCopy
2、使用并行流替换for
下面是优化过程中的注意事项:

使用BeanCopier替换BeanCopy:
1、数据量小用谁都行,数据量大使用BeanCopier。当数据量比较小的情况下,这两种属性的copy效率差不多,但是当数据量大了,BeanCopier效率远超BeanCopy;
2、使用BeanCopier的时候,需要注意,两个实体类之间相同属性的数据类型一定要一样,否则就无法copy,比如int和Integer就无法正常copy;
3、针对2的问题,可以使用Converter来进行转换,但是如果使用了useConverter,那么BeanCopier就会只按照useConverter的规则进行属性copy。所以在写创建一个实体类的时候,最好使用统一的数据类型,这也是一个良好的编程习惯。
另外使用BeanCopier也需要注意深度copy的问题。

使用并行流替换for:
因为循环只是在处理数据,每个数据之间互不干扰,所以使用jdk8的并行流比较合适,效率比使用for更是大大提高。

效果:

优化后,压测的效果是:相同数据量的情况下,相比之前,项目B该接口的数据处理效率提升了200倍。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值