发帖    主题    评论    推荐    标签    作者    订阅    查搜    注册   登陆   关注
 
面向对象 设计模式 领域驱动设计 企业架构 框架 开发教程 微服务 大数据 扩展性 并发编程 事件驱动 分布式 SOA
1 2 下一页 Go 2

关于open session in view,想在此请教!

              
2008-04-23 21:48
赞助商链接

最近公司开始了个新项目,使用的框架是Struts2+Spring2+Hibernate3,当然在这此我们不讨论架构。
主要是想讨论一下关于hibernate提到的open session in view.在我们的项目中,我们的事务边界是定界在service层。我们用hibernate的惰性加载,假设检索出一个对象A,这个对象又关联到另一对象B,那么我们检索完成对后就关闭了session,这时的B对象只是一个代理,并不是实际对象。那么当我们在界面上想通过检索出来的A对象再看B对象的属性的话,是不是要再重开一个session,把A对象再放到另一个session中去呢?这样如果应用open session in view,就不会出现这种脱管对象了,是吧,但这样的话,这个session不是要一直开着吗?这样对性能是一种考验吧。还有另一种做法是,检索出来A对象的时候通过copyproperties()拷贝出另一个对象出来,这样拷贝时就会把B对象的实际对象也检索出来关联到新的对象中去吧?但是这样也有问题:如果A对象里有n个类似于B对象的对象时又或者B对象还又关联到其他对象时,这个拷贝出来的对象不是会越来越大?这也是个问题,是吧?不知道各们对我的问题是不是认同,如果认同有什么解决方案?谢谢!

1
2008-04-24 08:51

>这样如果应用open session in view,就不会出现这种脱管对象了,是吧
不是,Open Session 其实是Open request,这个Session是存在一个request到response周期中。

2008-04-24 13:14

谢谢banq老师的的回复,我现在明白您说的open session 就是open request,这边的session是hibernate的session而非httpsession,对吧?也就是说客户一次点击--一般一个请求都是以一次点击表现吧,这样就在service调用dao了,这时session打开了,当用户得到自己想要的结果时,就是response的结束了,这时session也结束了,是吧?那么用户检索到的对旬还是一个脱管对象,是这样吗?当他访问这个脱管对象的关联对象的话,有两种可能:一种是再去开启另一个session,把这个脱管对象再放到新的session中去;还有就是出现异常,这代表这个脱管对象关联的对象实际是一个代理对象,是吧?

2008-04-24 15:43

> >这样如果应用open session in view,就不会出现这种脱管对象了,是吧
>不是,Open Session 其实是Open request,这个Session是存在一个request到response周期中。
我怎么觉得楼主说的是对的,open session in view其实就是延长了session的生命周期,性能肯定会受到影响,如果页面渲染耗费时间较长的话,说不定还会出现连接耗尽的情况。

2008-04-24 16:05

楼上的朋友,我想首先我说得还不够细吧,你的理解也是没错的。我想Open session in view这种模式,看你把事务边界设在哪了,如果是通过spring拦截器的话,那就像你说的会延长了session的生命周期,导致性能问题!我们的项目是定界于service层,而其实service的动作也是受web控制层的调遣,是吧?当用户发送一个请求过来时,web控制层通过了解这个请求,然后告诉service层,service层就知道要做什么事了。这时session就开启了。当service层把用户希望得到的信息检索出来后,session差不多就完成了,也就结束了。这时用户希望得到的信息--通过包装我们可以说至少是一个对象对hibernate来说就是个脱管对象了。所以就会出上我在三楼说的那样两种情况。当然那种会有异常的情况是基于hibernate的惰性加裁,而别一种情况就是可能出现又打开另一个session,然后把这个脱管对象又放到这个新的session中去了。应该说我这里提到的后一种情况是一种解决方案,这种方案可能导致频繁打开关闭session的情况。那还有一种解决方案就是在service层还没关闭session前把检过出来的对象通过copyproperiys()方法拷贝一个副本给web控制层。这时关闭了session就不会出现A对象中的关联对象B对象只是代理对象是吧,但是这种方案也有不足的地方,如果每个用户请求都是这样的方式处理,如果A对象关联的对象不只是B对象那么简单,那个这个A对象及其关联的对象到了web控制层时就会很庞大!所以这就是我想跟大家讨论的问题所在!

2Go 1 2 下一页

赞助商链接

赞助商链接

返回顶部

移动版 关于本站 使用帮助 联系管理员 最佳分辨率1366x768
OpenSource JIVEJDON Powered by JdonFramework Code © 2002-20 jdon.com