Форум программистов, компьютерный форум, киберфорум
Java: Spring, Spring Boot
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
1 / 1 / 0
Регистрация: 10.08.2014
Сообщений: 97

Java Spring метод который помечен @Async() и @Transactional() тормозит

06.04.2021, 23:27. Показов 3062. Ответов 8

Студворк — интернет-сервис помощи студентам
Java Spring метод который помечен @Async() и @Transactional() тормозит

Почему, когда отрабатывает метод
Java
1
List<OnlinerCatalog> onlinerCatalogDb = getOnlinerCatalogAndChildren();
Скорость перебора метода “test(Onliner onliner)”, падает примерно в 100 раз?
Причем если убрать аннотацию @Transactional() или закомментировать строку “List<OnlinerCatalog> onlinerCatalogDb = getOnlinerCatalogAndChildren();” , то всё работает быстро


Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
@Service
@EnableAsync
public class OnlinerStructureService {
 
    @Value("${upload.onlinerStructure}")
    private String pathStructure;
 
 
    @Autowired
    private OnlinerProductRepo onlinerProductRepo;
 
    @Autowired
    private OnlinerCatalogRepo onlinerCatalogRepo;
 
 
    @Transactional()
    @Async()
    public void onlinerStructureLoading() {
        System.out.println("Читаем каталог онлайнера из файла");
        Onliner onliner = readStructureFromFile();
 
        System.out.println("Обрабатываем модели онлайнера");
        test(onliner);
    }
 
 
 
 
    public void test(Onliner onliner) {
 
        List<OnlinerCatalog> onlinerCatalogDb = getOnlinerCatalogAndChildren();
 
        int countOnlinerModelId = 0;
        for (Category elCategory : onliner.getCategory()) {
            for (Vendor elVendor : elCategory.getVendor()) {
                for (Model elModel : elVendor.getModel()) {
                    int onlinerModelId = elModel.getId();
                    boolean isAnyOneTrue = onlinerProductRepo.existsByOnlinerId(onlinerModelId);
                    countOnlinerModelId++;
                    System.out.println("onlinerModelId - " + countOnlinerModelId); // печатаем сколько элементов обработано
                }
            }
        }
    }
 
    public List<OnlinerCatalog> getOnlinerCatalogAndChildren() {         // Получаем наш каталог онлайнера (структуру)
        List<OnlinerCatalog> onlinerCatalog = onlinerCatalogRepo.findAll();
        for (OnlinerCatalog el : onlinerCatalog) { // Заполняем чилдренов
            List<OnlinerCatalog> children = onlinerCatalog.stream().filter((с) -> с.getParentId() == el.getId()).sorted(Comparator.comparing(value -> value.getCategoryName())).collect(Collectors.toList());
            el.setChildren(children);
        }
        return onlinerCatalog;
    }
 
    public Onliner readStructureFromFile() {
        try {
            JAXBContext jaxbContext = JAXBContext.newInstance(Onliner.class);
            javax.xml.bind.Unmarshaller un = jaxbContext.createUnmarshaller();
            return (Onliner) un.unmarshal(new File(pathStructure));
        } catch (JAXBException e) {
            e.printStackTrace();
        }
        return null;
    }
 
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.04.2021, 23:27
Ответы с готовыми решениями:

Java Spring метод с аннотацией @Transactional сильно тормозит запросы к базе
Java Spring метод с аннотацией @Transactional сильно тормозит запросы к базе Когда я запускаю метод БЕЗ @Transactional, то он...

Spring Data + Transactional
Добрового времени суток, пишу тесты к дао. public interface RailwayTicketDao extends CrudRepository&lt;RailwayTicket, Long&gt; { ...

Spring repositories or/and transactional
Всем привет. Подскажите пожалуйста на пальцах логику применения @Repository и @Transactional. Я буду пользоваться Spring (и наверное...

8
1 / 1 / 0
Регистрация: 10.08.2014
Сообщений: 97
07.04.2021, 21:39  [ТС]
Никто не знает?
0
226 / 184 / 80
Регистрация: 13.04.2014
Сообщений: 694
08.04.2021, 20:50
внимательно посмотри, что написано в методе getOnlinerCatalogAndChildren()

1. достаешь всех onlinerCatalogRepo.findAll()
2. за n^3 потом заполняешь "чилдренов"
3. еще не плохо было бы знать, что в конце transactional происходит flush и все объекты, которые ты вытащил обновляются (тут меня возможно кто-то поправит), чтобы проверить, можно включить debug и посмотреть какие запросы улетают в бд
0
1 / 1 / 0
Регистрация: 10.08.2014
Сообщений: 97
08.04.2021, 21:13  [ТС]
Цитата Сообщение от asdzxc Посмотреть сообщение
внимательно посмотри, что написано в методе getOnlinerCatalogAndChildren()
1. достаешь всех onlinerCatalogRepo.findAll()
2. за n^3 потом заполняешь "чилдренов"
3. еще не плохо было бы знать, что в конце transactional происходит flush и все объекты, которые ты вытащил обновляются (тут меня возможно кто-то поправит), чтобы проверить, можно включить debug и посмотреть какие запросы улетают в бд
1-2 Достал onlinerCatalogRepo.findAll() список и код пошел дальше, больше список который достал этот метод НИГДЕ НЕ ИСПОЛЬЗУЕТСЯ. Тормоза начинаются на переборе объекта "onliner".
3. Если нет аннотации @Transactional(), то всё работает быстро, запросы проверял, разницы не заметил.
0
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
09.04.2021, 21:47
Проверьте, что вы не промахнулись и у вас именно спринговый Transactional.
Затем добавьте ему параметр readOnly=true и померьте снова.
0
1 / 1 / 0
Регистрация: 10.08.2014
Сообщений: 97
09.04.2021, 22:43  [ТС]
Цитата Сообщение от HighPredator Посмотреть сообщение
Проверьте, что вы не промахнулись и у вас именно спринговый Transactional.
Затем добавьте ему параметр readOnly=true и померьте снова.
Да, это readOnly=true помогло ускорится. Спасибо
Только не совсем понятно, если у меня в одном методе будут запускаться разные методы для обращения к БД, причем одни методы будут только на чтение, а другие на запись, как хибернейту указать что разные методы выполнять по разному?

Попробовал ставить над ними аннотацию, но не помогло.
0
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
10.04.2021, 13:09
Цитата Сообщение от 040985 Посмотреть сообщение
если у меня в одном методе будут запускаться разные методы для обращения к БД, причем одни методы будут только на чтение, а другие на запись, как хибернейту указать что разные методы выполнять по разному?
А зачем так пытаться делать? Есть какая-то конкретная проблема в указанном случае?
0
1 / 1 / 0
Регистрация: 10.08.2014
Сообщений: 97
10.04.2021, 23:53  [ТС]
Цитата Сообщение от HighPredator Посмотреть сообщение
А зачем так пытаться делать? Есть какая-то конкретная проблема в указанном случае?
В указанном случае так можно и не делать, но ситуации когда нужно что-то прочитать из базы и на основании полученных данных что-то записать встречаются постоянно
0
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
11.04.2021, 10:38
Ну там все зависит много от чего. Что и как делать, какие настройки, какая база под капотом, окружение и т.п. Ну то есть нужно смотреть в контексте, ибо условно все, что сложнее хеллоуворлдов, при проблемах требует детального рассмотрения.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.04.2021, 10:38
Помогаю со студенческими работами здесь

[Spring & Hibernate] Обойтись без @Transactional в контроллере
На SO прочитал, что все транзакции должны быть в сервисах и следует избегать @Transactional в контроллерах. Сейчас у меня контроллер...

Async/ await как правильно ввести данные в async метод (консоль)
Привет , кто то может помочь ?) проблема в тому что у меня есть async метод который запускается из Main, по среди этого метода...

Как запустить Java метод из JavaScript используя Spring Boot
Всем, привет! Возник очередной вопрос по спрингу, а именно как из JS функции вызвать метод Java. А теперь грязные подробности. Есть к...

@Transactional метод и проверка исключений
Имеется стандартный класс AccountingDAO для сохранения изменений аккаунтов. Так вот приложение переводит деньги с одного аккаунта на другой...

Async Task тормозит UI и не выводит диалог
Доброго времени суток, друзья. Начитался про AsyncTask и решил запихнуть дерганье данных с сервера в поток. Данные с сервера тянутся,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита, которое может. . .
Команды "Заполнить" и "Очистить" на форме документа
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". На примере нетипового документа разработанного в конфигурации КА2. В качестве источника данных указан регистр накопления, в который записываются данные о. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru