在各处使用DTO是否会影响jvm上的内存使用?

时间:2018-10-05 06:20:47

标签: java performance memory jvm modelmapper

所以我的问题在我的项目中,我正在Service类中使用模型映射器。因此,当服务调用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。

1 个答案:

答案 0 :(得分:0)

如果您担心从纯JPA对象转换为DTO的时间成本,则不必担心。这就是为什么。

与许多其他操作相比,对象分配确实很慢,但与IO相比却丝毫不慢。我确定您的JPA服务将从数据库中获取某些东西。如果我是正确的话,那么突然之间,您花费在新对象分配上的时间(以及以后产生的GC成本)将不到您刚花在数据库操作本身上的时间的0.01%。

如果您针对速度进行了优化,则减少内存分配是个好主意,但到目前为止,这并不是您要做的第一件事。只有在优化了成本更高的操作(例如数据库查询)之后,才有意义。

免责声明: 在某些情况下,您的DTO会证明是昂贵的。如果您碰巧在JPA对象中使用延迟加载,那么您将要进行的DTO转换将完全克服这一点。延迟加载将允许JPA 不获取 JPA对象图的某些子元素,但是作为DTO转换的一部分,您每次都会请求“可选”数据,从而将您带回到您是在开始使用Lazy之前开始的。