在任何地方使用 DTO 会影响 jvm 上的内存使用吗?



所以我的问题在我的项目中,我在我的服务类中使用模型映射器。因此,当服务调用 Dao 层(实际上只是一个 JPA 存储库接口(时,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。

如果您担心从纯 JPA 对象转换为 DTO 的时间成本,请不要这样做。原因如下。

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

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

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