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倍。
标签:BeanCopier,BeanCopy,数据量,使用,copy,属性 来源: https://blog.csdn.net/zhiwen0_zhang/article/details/115673990