hibernate多线程多会话和对象

时间:2012-06-28 04:05:36

标签: java multithreading hibernate session

关于设置的几个事实:

  • 这是一个基于Tomcat的应用程序(尽管问题出现在Tomcat的背景之外 - JUNIT)
  • 不使用Spring
  • 每个线程都有自己的Hibernate 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对象但听起来如此......阻塞(线程),我当然可以避免所有这些。

我确信这些问题很久以前就已经解决了,只需要找到它(不需要重新发明轮子)。

2 个答案:

答案 0 :(得分:1)

该对象附加到Hibernate会话,是的。它只能一次附加一个,是的。除非您关闭Hibernate会话,否则您可以尝试evict()该对象,从而将其从会话中分离,从而可以将其加载到另一个线程中。问题是,根据您的程序流程,这可能不实用。

答案 1 :(得分:0)

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