spring 如何避免一对一关系并发访问(可能是java sync,hibernate或jms问题)

cvxl0en2  于 12个月前  发布在  Spring
关注(0)|答案(1)|浏览(105)

在我的spring-hibernate应用程序中,它也有JMS,多个消费者同时访问一个方法,该方法为我们提供了将对象记录到MySQL数据库的持久性。由于该方法的并发访问,我在其中编写的逻辑在某些情况下会失败。我分享的逻辑如下:

// 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);
}

正如你所看到的,如果多个消费者同时访问这个代码块,log的大小应该为0,因此它们持久化同一个对象两次或更多次。
在JMS和多个消费者使用的情况下,我如何避免对象的多个持久化?
是否可以通过使用Java的syncronized特性来实现?

h9vpoimq

h9vpoimq1#

是的,我认为如果包含这个日志记录方法的对象在许多线程之间共享,那么在这里有一个锁并在该锁上使用synchronized应该确实有效。
它应该像这样简单:

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

public void log(){

    synchronized(monitor){
    .....

    }
}

相关问题