Ситуация такая: в пэкедже создается 6 энтити, которые в свою очередь являются потоками. Во время выполнения они заходят в saveTelegram (для того чтобы получить id из базы) и получается так, что пара энтити имеют одинаковый id, по этому часть не записывается в таблицу.
Synchronized не помогает, так как потоки не зависят друг от друга. Среди работающих вариантов решения проблемы были пауза thread.sleep(1000) и автоинкрементить id сразу в таблице не заходя в saveTelegram - но такое решение не подходит. Есть ли еще идеи как решить данную проблему?
@Lock(LockType.WRITE)
public Telegram saveTelegram(String ioNode, long userId,
String functionCode, byte[] payload) throws ProcessException {
TelegramId histObj = persistenceManager.findTelegramId();
Long entityId = histObj.getNextVal();//вытаскиваем id из таблицы TelegramId
persistenceManager.updateTelegramId(histObj);
TelegramHist telegramHist = createTelegram(entityId,
ioNode, userId, payload, functionCode);
telegramHist = persistenceManager.saveOrUpdate(telegramHistoric);//записываем энтити в другую таблицу
return telegramHist;
}
так как данную проблему решает thread.sleep(1000) и две энтити ссылаются на один айдишник - я думаю что этот метод не потокобезопасный. И как решить данную проблему не знаю
надо в самом методе методА сделать возможность некого лока для потоков.
Одним из простых и рабочих решениях может быть использование try-lock ReentrantLock.
public class MyClass {
private final ReentrantLock lock = new ReentrantLock(true);
public Integer getMethodA() {
lock.lock();
try {
/// вот тут получение ID
return ID;
} finally {
lock.unlock();
}
Ну да тут наследование вообще никакой роли не играет. Самое простое это сделать метод статическим и синхронизированным(static synchronized) и будет синхронизация.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости