论坛首页 Java企业应用论坛

延迟加载时为什么不自动open session呢?

浏览 8969 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-04-19  
我觉得如果你有这个困惑的话,就有必要去学习一下什么是Session了。
关闭Session不意味着关闭Connection;
长连接是一个相对的概念,opensessioninview不是长连接的代名词。

HRoger的问题,是一个设计问题,也是一个技巧问题。
google一下DTO,也可以查查Hibernate API中Hibernate.initialize()这个方法。
0 请登录后投票
   发表时间:2008-12-12  
robbin 写道
事情没你想像的那么简单。Hibernate通过Session的一级缓存来管理持久化对象的状态,当Session关闭之后,持久化对象究竟处于何种状态是未知的,此时如果自动打开第2个Session,这个Session的缓存里面没有这个持久化对象的引用关系,因此无法判断对象状态,那么就很有可能带来一些不可预知的后果,比方说应该update的时候却没有update,应该级联插入却没有插入等等。



其实没有想象中这么复杂的,一级缓存存在的主要目的是维护事务独立性,
也就是在事务中的未提交数据在一级缓存中,不会影响到二级缓存,
当事务提交后,一级缓存同步到二级缓存中,
到达页面中的时候,事务当然已经结束,此时一级缓存已经同步到二级缓存中。
归根结底,页面层次只是view级别,
所以新开一个session用于页面延迟加载,也就是新开一个数据库连接用来查看而已,
直接使用二级缓存是没有问题的。

0 请登录后投票
   发表时间:2008-12-12  
我弱弱的问下拦截器不行么?
拦截器难道算是长连接么?
0 请登录后投票
   发表时间:2008-12-12  
opensessioninview并不等于长连接
opensessioninview只是保持session不关闭,但是在一般情况下,当事务提交过后,session会释放数据库连接,但是session并不关闭
当再次需要读取数据库时,session会重新获取连接
0 请登录后投票
   发表时间:2008-12-13  
HRoger 写道
最近,我也碰到了这个问题,感觉延迟加载就像鸡肋,我的客户端是基于Eclipse的rpc的,通过webservice来调用的,很难实现opensessioninview,我只能lazy=“false”来解决了,不知大家对于webservice这样东西,用Hibernate有什么好的建议


用webservice的话我一般就做一个dto然后用BeanUtils拷贝一下属性了,虽然麻烦一点,不过也是没有办法,总比lazy=false好点,毕竟如果是是集合的话,还是影响性能的,需要什么属性就做一个相应的dto,通过BeanUtils拷贝还是很方便的.
0 请登录后投票
   发表时间:2008-12-14  
huangjiej 写道
    用了hibernate都有差不多2年时间,一直都没有深入研究,最近学习起它的延迟加载。
    在网上找了很多资料,它们都是说,使用延迟加载时,被加载对象(也就是那个proxy)必须是同一个session打开的前提下,才能获取数据,否则,会抛出session is closed 或 disconnection session 异常。
    对此,我有个疑问,为什么hibernate在检测到与proxy相关联的session 是close或disconnection 时,不自动open,反而是抛异常。可能是为了事务的一致性考虑。
    了解这个问题的目的是要找出一种方法替代opensessioninview,我认为,延迟加载可以用于2个场景中,一个是从数据库取出数据,并传递到view层展现;另一个是在后台处理的时候。若是第一种场景的话,我觉得proxy取数据时,自己打开session并以只读方法加载数据,并不需要用opensessioninview的长连接。至于后一种在后台处理时,大可以把所需要的数据预先取出,而不需要使用延迟加载。
    希望各位发表一下意见。

0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics