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

Java 到处使用DTO会影响jvm上的内存使用吗?,java,performance,memory,jvm,modelmapper,Java,Performance,Memory,Jvm,Modelmapper,所以我的问题是在我的项目中,我在我的服务类中使用模型映射器。因此,当服务调用Dao层(实际上只是一个JPA存储库接口)时,Dao层现在成功地返回实体,而不仅仅是返回实际实体,我首先使用java的模型映射器将其转换为DTO(这是实体的精确副本)。 因为我不想直接暴露我的实体 代码示例: public class FormService { @Autowired private FormMasterDao formMasterDao; @Autowired pri

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

代码示例:

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);
    }

}
公共类FormService{
@自动连线
私人FormMasterDao FormMasterDao;
@自动连线
私有模型映射器映射器;
要保存的公共FormMasterDTO(FormMasterDTO FormMasterDTO){
FormMaster FormMaster=buildFormMaster(formMasterDTO);
将convertToFormMasterDTO返回(formMasterDao.save(formMaster));
}
公共列表findById(字符串id){
返回表单masterdao.findByIdIn(id)
.stream()
.map(此::convertToFormMasterDTO)
.collect(toList());}
public void updateAll(列表格式MasterdToList){
formMasterDao.saveAll(formMasterDTOList.stream()
.map(此::convertToFormMaster)
.collect(toList());
}
公共FormMasterDTO更新(FormMasterDTO FormMasterDTO){
返回convertToFormMasterDTO(formMasterDao.save(convertToFormMaster(formMasterDTO));
}
专用FormMaster数据转换为FormMaster数据转换(FormMaster FormMaster){
返回mapper.map(formMaster,FormMasterDTO.class);
}
专用FormMaster转换器到FormMaster(FormMasterDTO到FormMasterDTO){
返回mapper.map(formMasterDTO,FormMaster.class);
}
}
我发现这种方法很有用,因为如果许多开发人员在工作和编写代码时不允许他们直接使用实体


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

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

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

在优化速度的情况下,内存分配是一个减少内存分配的好主意,但到目前为止,不应该是您要做的第一件事。只有在优化了成本更高的操作(如DB查询)之后,才有必要这样做

免责声明:
在这种情况下,DTO的成本会很高。如果您碰巧在JPA对象中使用延迟加载,那么您将要进行的DTO转换将完全克服这一点。延迟加载将允许JPA不获取JPA objectgraph的某些子元素,但作为DTO转换的一部分,您每次都会请求“可选”数据,这反过来会使您回到开始使用
Lazy

之前开始的位置,除非您有一个实际加载的性能配置文件,它告诉您,如果创建的对象数量有问题,99%的可能性只是猜测,假设这可能是个问题。我建议使用flight recorder运行您的应用程序,以查看您的应用程序在哪里花费时间。我同意@Gergely的观点,但我的问题是,我正在使用模型映射器将每个实体转换回DTO。。。。这真的会影响系统吗?事实上,我是在做单一责任的事情。例如,您只需提供id,我将提供您使用的实体的副本DTO。但每次提供一个副本都需要模型映射器。那么它真的会影响系统吗?我见过有人不必要地使用集合。我不完全确定我是否理解您的评论,但是:您是否有一个每次给它一个ID时都返回完整对象的代码?如果是,则可能是性能噩梦是的。如果没有适当的缓存(这不是小事,但要做好),您将不断地从数据库中获取内容。这(而不是DTO转换本身)将是一件极其缓慢的事情。如果你更新这个问题(或者更好地创建一个新问题),我们将找到一个比这个更好的解决方案。