hibernate会话范围错误

时间:2011-12-29 17:24:54

标签: hibernate session grails

我正在使用grails web-app

应用程序在一个非常慢的网络上运行,并且正在运行IE 6的旧的和慢速的客户端PC访问。数据库连接非常慢并且db过度工作。因此,最小化db调用和来回传递的数据是一个优先事项

我知道使用会话范围不是最佳做法。在这种情况下,我认为这将是最好的。考虑到我的所有页面都需要相同的对象集,这将使它们在

上多次获取

所以我将我的对象放在会话范围session.obj = obj

一个问题就可以了 由于系统速度很慢,因此可以多次点击指向网页的链接(控制器/操作)。

当发生这种情况时,我会在某些情况下收到错误消息 org.hibernate.HibernateException:非法尝试将集合与两个打开的会话相关联

此代码发生错误

if (!obj?.isAttached()) {
   obj?.attach()
}

我必须将对象附加回hibernate会话,以便我可以延迟加载相关对象 我不想急于获取(可能是一个解决方案) 我似乎错误是因为当对象被多次连接时。这个条件似乎没有阻止这个问题。这是竞争条件吗?

我只是想知道是否有人能解决这个问题或知道原因

谢谢

1 个答案:

答案 0 :(得分:2)

如果你想避免往返数据库并仍以安全的方式编码,而不必处理与Hibernate会话之间的连接/分离对象,你应该做的是使用Hibernate二级缓存。这样就可以透明地缓存经常使用的实体,它们的关联,甚至是经常执行的查询的结果。

缓存也会更高效并使用更少的内存,因为它将在所有用户会话中共享。当然,它会更安全,因为在HTTP会话中你不会有陈旧的实体。

绝对是要走的路,IMO。