猿问

到处使用 DTO 会影响 jvm 上的内存使用吗?

所以我的问题是在我的项目中,我在我的服务类中使用模型映射器。因此,当服务调用 Dao 层(实际上只是一个 JPA Repository 接口)时,Dao 层现在成功返回实体而不是仅返回实际实体,我首先将其转换为 DTO(这是实体的精确副本)使用java的模型映射器。因为我不想直接公开我的实体。


代码示例:


public class FormService {


    @Autowired

    private FormMasterDao formMasterDao;


    @Autowired

    private ModelMapper mapper;


    public FormMasterDTO save(FormMasterDTO formMasterDTO) {


        FormMaster formMaster = buildFormMaster(formMasterDTO);


        return convertToFormMasterDTO(formMasterDao.save(formMaster));

    }



    public List<FormMasterDTO> findById(String id) {


        return formMasterDao.findByIdIn(id)

                .stream()

                .map(this::convertToFormMasterDTO)

                .collect(toList());    }


    public void updateAll(List<FormMasterDTO> formMasterDTOList) {


        formMasterDao.saveAll(formMasterDTOList.stream()

                .map(this::convertToFormMaster)

                .collect(toList()));

    }


    public FormMasterDTO update(FormMasterDTO formMasterDTO) {

        return convertToFormMasterDTO(formMasterDao.save(convertToFormMaster(formMasterDTO)));

    }


    private FormMasterDTO convertToFormMasterDTO(FormMaster formMaster) {

        return mapper.map(formMaster, FormMasterDTO.class);

    }


    private FormMaster convertToFormMaster(FormMasterDTO formMasterDTO) {

        return mapper.map(formMasterDTO, FormMaster.class);

    }


}

我发现这种方法很有用,因为如果许多开发人员工作和编写代码,他们就不能直接使用实体。


但我想知道,使用这种方法是否不好?会,它会影响 JVM,因为每次有人点击服务时,我都会将其转换为 DTO。


喵喵时光机
浏览 139回答 1
1回答

拉丁的传说

如果您担心从纯 JPA 对象转换为 DTO 的时间成本,那么请不要担心。这是为什么。与许多其他操作相比,对象分配确实很慢,但与 IO 相比一点也不慢。我确信您的 JPA 服务会从数据库中获取一些东西。如果我是对的,那么突然间您花在新对象分配上的时间(以及以后产生的 GC 成本)将少于您花在 DB 操作本身上的时间的 0.01%。如果您针对速度进行了优化,减少内存分配是一个好主意,但到目前为止,这应该不是您要做的第一件事。只有在优化成本更高的操作(例如数据库查询)之后才有意义。免责声明:&nbsp;在某些情况下,您的 DTO 会被证明是昂贵的。如果您碰巧在 JPA 对象中使用延迟加载,那么您即将进行的 DTO 转换将完全击败它。延迟加载将允许 JPA不获取JPA 对象图的某些子元素,但作为 DTO 转换的一部分,您每次都会请求“可选”数据,这反过来会使您回到开始使用Lazy.
随时随地看视频慕课网APP

相关分类

Java
我要回答