Как избежать одновременного доступа один к одному (возможно, проблема синхронизации Java, спящего режима или jms) - PullRequest
1 голос
/ 26 января 2012

В моем приложении spring-hibernate, в котором также есть active-mq, несколько потребителей одновременно получают доступ к одному из методов, который обеспечивает постоянство регистрации объектов в mysql db для нас. Из-за параллельного доступа к этому методу кодировка, которую я в нем закодировал, в некоторых случаях дает сбой. Я делюсь логикой ниже:

// check the current sourceId whether is included or not in log table
List<MyLogObject> logs = logService.findBySourceId(currentSourceId); 

if(logs.size() == 0){
  logService.persist(currentLogObject);
}

Как вы видите, если несколько потребителей обращаются к этому блоку кода одновременно, размер журнала должен возвращать 0 для них, и, таким образом, они сохраняют один и тот же объект дважды или более.

Как мне избежать многократного сохранения объекта в случае active-mq и многократного использования потребителем.

Возможно ли добиться этого с помощью функции синхронизации Java?

Заранее спасибо.

1 Ответ

1 голос
/ 29 января 2012

Да, я думаю, что наличие здесь блокировки и использование синхронизации с этой блокировкой должно действительно работать, если объект, содержащий этот метод ведения журнала, является общим для многих потоков.

Это должно быть так просто, как:

class YourClass{
    .....
Object monitor = new Object();

public void log(){

    synchronized(monitor){
    .....

    }
}
...