java - hibernate多线程多 session 和对象

标签 java multithreading hibernate session

有关设置的一些事实:

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

进行上述设置后,我遇到了以下错误:

  • org.hibernate.HibernateException:非法尝试将代理与两个打开的 session 关联
  • org.hibernate.StaleObjectStateException:行已被另一个事务更新或删除(或未保存值映射不正确)

我的理解是

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

问题很明显:

  • 我理解核心问题(上文)吗?
  • 如何避免此类问题?
  • 是否有经验法则可以帮助避免这些问题?
  • 使用 Spring 是否有助于解决这个问题(请具体说明一下)?
  • 从数据存储区获取每个对象后将其与 Session 分离,然后在更新之前将其附加到 Session 是否是处理该问题的理想方法?

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

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

最佳答案

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

关于java - hibernate多线程多 session 和对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11237924/

相关文章:

java - 将 vector 图像添加到 Google Maps Android API v2

java - Java 线程和同步问题

java - Java守护进程线程在其父进程退出时会自动终止吗?

spring - 通用代码因 Spring 数据和 Querydsl 失败

java - 使用 HashMap 对相似的项目进行分组

java - 公共(public)静态工厂方法

C++ 在后台读取文件

java - Spring MVC 中的异常

mysql - 通过 hibernate 将 tomcat 容器上的 web 应用程序连接到 mysql 容器

java - 为什么我的 Ant 删除不起作用?