我在java多线程项目中获得org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect):
。
我试图在两个不同的线程中访问相同的数据库记录。我该如何解决这个问题。这是我遇到错误的方法,
@Override
@Transactional
public Gamedetail getByExternalGameIdAndSource(String id, String dataSource) {
return (Gamedetail) sessionFactory.getCurrentSession().createCriteria(Gamedetail.class).add(Restrictions.eq("externalgameid", id))
.add(Restrictions.eq("datasource", dataSource)).uniqueResult();
}
我知道hibernate会话不支持多线程。我使用了原生的sql查询但是它给了我类转换异常。提前谢谢。
答案 0 :(得分:0)
根据评论我会选择一个解决方案,你将拥有一个共享队列,两个线程将共享,一个线程将保存/更新gameDetail
个对象到数据库。该单个线程将处理对不存在的记录的更新将在DB中创建一个的情况。您可以同步对此队列的访问,也可以更好地使用线程安全的并发队列,例如ConcurrentLinkedQueue。
请记住,这种方法可能无法产生更好的性能,因为两个线程之间存在争用以访问共享队列。