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

Does using DTOs everywhere affect memory usage on jvm?

所以我的问题是在我的项目中,我在我的服务中使用模型映射器 类。因此,当服务调用 Dao 层(实际上只是一个 JPA Repository 接口)时,Dao 层 returns 现在成功实体而不是仅仅返回实际实体,我首先将其转换为 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。

如果您担心从纯 JPA 对象转换为 DTO 的时间成本,那就不用了。这是原因。

与许多其他操作相比,对象分配确实很慢,但与 IO 相比一点也不慢。 我相信您的 JPA 服务将从数据库中获取一些东西。如果我是正确的,那么您花在新对象分配上的时间(以及后来产生的 GC 成本)将突然少于您花在 DB 操作本身上的时间的 0.01%。

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

免责声明: 在某些情况下,您的 DTO 会被证明是昂贵的。如果您碰巧在 JPA 对象中使用延迟加载,那么您将要进行的 DTO 转换将完全击败它。延迟加载将允许 JPA 不获取 JPA 对象图的某些子元素,但作为 DTO 转换的一部分,您将每次请求 "optional" 数据,这反过来会让你回到开始使用 Lazy.

之前的起点