在我的 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);
}
如您所见,如果多个消费者同时访问此代码块,则日志大小应为他们返回 0,因此他们会两次或更多次持久保存同一个对象。
在 JMS 和多个消费者使用的情况下如何避免对象的多次持久化。
是否可以使用Java的
syncronized
功能来实现这一点?
是的,我认为如果包含此日志记录方法的对象在许多线程之间共享,那么在这里拥有一个锁并在该锁上使用同步应该确实有效。
它应该像这样简单:
class YourClass{
.....
Object monitor = new Object();
public void log(){
synchronized(monitor){
.....
}
}