Я просто ищу совета высокого уровня при решении проблемы с многопоточным приложением.
Вот как это работает:
Приложение принимает Alerts, которые затем обрабатываются в разных потоках для создания Reports. Иногда два Alerts включают один и тот же Report, однако это нежелательно.
Это приложение Spring, написанное на Java с использованием базы данных MySQL.
Я изменил свой код, чтобы выполнить SQL-запрос SELECT перед сохранением Report, который проверяет, существует ли уже аналогичный отчет. Если он существует, Report не создается. Однако, если два Alerts поступают одновременно, команда SELECT запускается для Report #2 перед сохранением Report #1.
Я думал о включении sleep () со случайным временем ожидания 1-10 секунд, но это все равно вызовет проблему, если двум потокам назначено одинаковое случайное время сна.
Я новичок в многопоточности, есть ли у кого-нибудь идеи? Или ресурсы, чтобы указать мне правильное направление.
Большое спасибо!!




Предположим, у вас есть код, который выглядит примерно так:
Report report = getReport(...); // calls the DB to get a record to see if it already exists
if (report == null) {
insertReport(...); // add a record to DB which might have already been added by another thread
}
затем, чтобы избежать конфликтов между потоками (или JVM), объедините SELECT и INSERT. Например:
insertReportIfNotAlreadyExists(...);
который использует запрос, структурированный как:
INSERT INTO REPORTS (...) VALUES (...)
WHERE NOT EXISTS (...)
с предложением NOT EXISTS SELECT для записи, чтобы убедиться, что она еще не существует.
Звучит идеально. Теперь как понять, как это сделать с помощью Hibernate, ха-ха.