精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-04-19
我觉得如果你有这个困惑的话,就有必要去学习一下什么是Session了。
关闭Session不意味着关闭Connection; 长连接是一个相对的概念,opensessioninview不是长连接的代名词。 HRoger的问题,是一个设计问题,也是一个技巧问题。 google一下DTO,也可以查查Hibernate API中Hibernate.initialize()这个方法。 |
|
返回顶楼 | |
发表时间:2008-12-12
robbin 写道 事情没你想像的那么简单。Hibernate通过Session的一级缓存来管理持久化对象的状态,当Session关闭之后,持久化对象究竟处于何种状态是未知的,此时如果自动打开第2个Session,这个Session的缓存里面没有这个持久化对象的引用关系,因此无法判断对象状态,那么就很有可能带来一些不可预知的后果,比方说应该update的时候却没有update,应该级联插入却没有插入等等。
其实没有想象中这么复杂的,一级缓存存在的主要目的是维护事务独立性, 也就是在事务中的未提交数据在一级缓存中,不会影响到二级缓存, 当事务提交后,一级缓存同步到二级缓存中, 到达页面中的时候,事务当然已经结束,此时一级缓存已经同步到二级缓存中。 归根结底,页面层次只是view级别, 所以新开一个session用于页面延迟加载,也就是新开一个数据库连接用来查看而已, 直接使用二级缓存是没有问题的。 |
|
返回顶楼 | |
发表时间:2008-12-12
我弱弱的问下拦截器不行么?
拦截器难道算是长连接么? |
|
返回顶楼 | |
发表时间:2008-12-12
opensessioninview并不等于长连接
opensessioninview只是保持session不关闭,但是在一般情况下,当事务提交过后,session会释放数据库连接,但是session并不关闭 当再次需要读取数据库时,session会重新获取连接 |
|
返回顶楼 | |
发表时间:2008-12-13
HRoger 写道 最近,我也碰到了这个问题,感觉延迟加载就像鸡肋,我的客户端是基于Eclipse的rpc的,通过webservice来调用的,很难实现opensessioninview,我只能lazy=“false”来解决了,不知大家对于webservice这样东西,用Hibernate有什么好的建议
用webservice的话我一般就做一个dto然后用BeanUtils拷贝一下属性了,虽然麻烦一点,不过也是没有办法,总比lazy=false好点,毕竟如果是是集合的话,还是影响性能的,需要什么属性就做一个相应的dto,通过BeanUtils拷贝还是很方便的. |
|
返回顶楼 | |
发表时间: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的长连接。至于后一种在后台处理时,大可以把所需要的数据预先取出,而不需要使用延迟加载。 希望各位发表一下意见。 |
|
返回顶楼 | |