Повлияет ли использование DTO повсеместно на использование памяти в jvm? - PullRequest
0 голосов
/ 05 октября 2018

Итак, мой вопрос в моих проектах, я использую модель сопоставления в моих классах обслуживания.Поэтому, когда служба вызывает слой 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.

1 Ответ

0 голосов
/ 05 октября 2018

Если вас беспокоит временная стоимость преобразования из чистого JPA-объекта в DTO, не делайте этого.Вот почему.

Распределение объектов действительно медленное, по сравнению со многими другими операциями, но совсем не медленное по сравнению с IO. Я уверен, что ваш JPA-сервис будет собирать что-то из базы данных,Если я прав, то внезапно время, которое вы потратите на выделение нового объекта (и понесенную стоимость GC позже), будет меньше, чем 0,01% времени, которое вы только что потратили на саму операцию БД.

В случае, если выОптимизация для скорости, распределение памяти - это хорошая идея для сокращения, но это далеко не первое, что вы делаете.Это имеет смысл делать только после того, как вы оптимизировали намного более дорогостоящие операции, такие как запросы к БД.

Отказ от ответственности: В некоторых случаях ваш DTO окажется дорогостоящим.Если вам случится использовать ленивую загрузку в ваших объектах JPA, DTO-преобразование, которое вы собираетесь сделать, полностью победит это.Ленивая загрузка позволила бы JPA не извлекать определенные подэлементы вашего графа объектов JPA, но как часть DTO-преобразования вы будете запрашивать «необязательные» данные каждый раз, что, в свою очередь, вернет вас туда, где выначал до начала использования Lazy.

...