2011-12-29 105 views
0

我工作的一个Grails web应用程序Hibernate的Session范围错误

该应用程序是一个非常缓慢的网络上运行,并且正在运行的IE 6,又老又慢客户端PC的访问的数据库连接是非常慢,数据库已结束工作。所以最小化数据库调用和数据传递是一个优先事项

我知道使用会话范围并不是最佳实践。在这种情况下,我认为这将是最好的。考虑到我的所有网页需要相同的对象,而这将让他们在

获取很多次,我把我的对象在会话范围session.obj = obj

它正常工作与一个问题 由于该系统是如此在网页链接(控制器/操作)上减慢多次点击是可能的。

当发生这种情况我在一些情况下,得到一个错误 org.hibernate.HibernateException:非法尝试集合有两个打开的会话

这个代码

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

我有发生的错误关联将对象附加到休眠会话,所以我可以懒加载相关的对象 我不想急于获取(可能是解决方案) 我似乎错误是当对象被连接多次时引起的。这种情况似乎并没有阻止这个问题。这是一种竞赛状态吗?

我只是想知道如果任何人有一个解决这个问题,或者知道原因

谢谢

回答

2

如果你想避免在一个安全的方式往返到数据库中,仍然代码,而不必处理从Hibernate会话中挂载/分离对象,你应该做的就是使用Hibernate的二级缓存。这将使透明缓存经常使用的实体,它们的关联,甚至经常执行的查询结果。

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

肯定要走的路,国际海事组织。