Spring Async для пакетной вставки - PullRequest
0 голосов
/ 11 мая 2018

Я использую весеннюю загрузку. Я был новичком в весне и начал весенний проект. Так что я не знал о заранее определенных репозиториях (JPA, CRUD), которые можно легко реализовать. В случае, если я хотел сохранить массив данных, поэтому я использую для цикла и сохраняю по одному, это занимает больше времени. Поэтому я попытался использовать @ Async . Но это также не работает, моя концепция не так?

@ Async имеет два ограничения

  • оно должно применяться только к публичным методам
  • самовывоз - вызов асинхронного метода из того же класса не будет работать

1) Контроллер

for(i=0;i < array.length();i++){
    // Other codes
    gaugeCategoryService.saveOrUpdate(getEditCategory);
}

2) Дао реализации

@Repository
public class GaugeCategoryDaoImpl implements GaugeCategoryDao {
    // Other codings

    @Async
    @Override   
    public void saveOrUpdate(GaugeCategory GaugeCategory) {
        sessionFactory.getCurrentSession().saveOrUpdate(GaugeCategory);
    }
}

После удаления @Async работает нормально. Но с этой аннотацией это не работает. Есть ли альтернативный метод для трудоемких? Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

На мой взгляд, есть несколько проблем с вашим кодом:

  1. Вы перезаписываете метод saveOrUpdate() без необходимости в этом. Простого вызова super () должно было быть достаточно, чтобы заставить @Async работать.

  2. Я предполагаю, что вы где-то (в вашем классе контроллера?) Объявляете транзакционный контекст. Это обычно относится к текущему потоку. Используя @Async, вы можете оставить этот контекст транзакции, поскольку (из-за асинхронного выполнения DAO) основной поток может быть уже завершен при вызове saveOrUpdate(). И хотя я в настоящее время точно не знаю, есть хорошее изменение, что объявленная транзакция действительна только для текущего потока.

Одно возможное исправление: создайте дополнительный компонент, например AsyncGaugeCategoryService или около того:

@Component
public class AsyncGaugeCategoryService {

    private final GaugeCategoryDao gaugeCategoryDao;

    @Autowired
    public AsyncGaugeCategoryService(GaugeCategoryDao gaugeCategoryDao) {
        this.gaugeCategoryDao = gaugeCategoryDao;
    }

    @Async
    @Transactional
    public void saveOrUpdate(GaugeCategory gaugeCategory) {
        gaugeCategoryDao.saveOrUpdate(gaugeCategory);
    }
}

Затем внедрите службу вместо DAO в ваш класс контроллера. Таким образом, вам не нужно перезаписывать какие-либо методы, и вы должны иметь действительный транзакционный контекст в вашем асинхронном потоке.

Но имейте в виду, что ваш поток выполнения не даст вам никаких подсказок, если что-то пойдет не так во время хранения в базе данных. Вам нужно будет проверить файлы журнала, чтобы обнаружить любые проблемы.

0 голосов
/ 11 мая 2018

аннотация @Async создает поток при каждом вызове этого метода. но вы должны включить его в своем классе, используя эту аннотацию @ EnableAsync Вам также необходимо настроить bean-компонент asyncExecutor. Вы можете найти более подробную информацию здесь: https://spring.io/guides/gs/async-method/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...