休眠多线程多会话和对象



关于设置的几个事实:

  • 这是一个基于Tomcat的应用程序(尽管问题也出现在Tomcat的上下文之外 - JUNIT)
  • 不使用弹簧
  • 每个线程都有自己的休眠Session(TLS)
  • 对象以混合方式保存/加载,即ObjA可能由线程 A 创建,然后由线程 B 操作,甚至稍后由线程 A 更新,再次由线程 Z 操作,但这次使用 HQL

进行上述设置后,我收到错误,例如:

  • org.hibernate.HibernateException: illegally attempted to associate a proxy with two open Sessions
  • org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect)

我的理解是

  • 这一切都与Hibernate的Session有关,因为会话"拥有"附加"到它的对象(它创建/加载的对象)
  • 并且可能是缓存问题

问题很明显:

  • 我是否了解(上述)核心问题?
  • 如何避免此类问题?
  • 是否有有助于避免这些问题的经验法则?
  • 使用Spring是否有助于解决它(请具体一点)?
  • 从数据存储中获取每个对象后,从Session中分离每个对象,并在更新之前将其附加到Session,是否是处理它的理想方法?

如果我只使用一个Session对象,我当然可以避免所有这些,但这听起来如此......阻塞(线程方面)。

我敢肯定这类问题很久以前就解决了,只需要找到它(无需重新发明轮子)。

对象附加到休眠会话,是的。是的,它一次只能附加到一个。除非关闭休眠会话,否则可以尝试evict()对象,从而将其与会话分离,从而可以在另一个线程中加载它。问题是,这可能不切实际,具体取决于您的程序流程。

在获取对象之前调用clear()

最新更新