freeren
2008-04-23 15:13
今天也一直在想这个问题,我觉得这个可能对于事务有好处,但是对性能可能没什么好处。主要有以下理解:
如果用open session in view的话,session就要一直开着。这样的话性能是个问题,因为如果我们使用的是hibernate的惰性加裁的话,那么我们取到的对象又关联的对象的话,就只是取到其代理,不是是其真正关联的对象了,这样到了页面上,如果要取得真正对象的数据,是不是要一直开着session呢?如果用户迟迟没去读取这个关联对象的话,那session要开多久呢?这种问题不知道用beanutils的copyproperties()方法能不能解决,因为本人不知道其执行时会不会去调用其中的所有get()的方法。如果可以的话,把这个对象copy出来后就可以关闭session了。

xmuzyu
2008-09-10 15:55
TO freeren
>>如果用户迟迟没去读取这个关联对象的话,那session要开多久呢?
session打开是在一个request周期,是为了渲染视图的,比如你用个迭代标签去迭代数据。只要已经刷新到客户端了,request结束了,session也就关闭了。如果不用OSIV的话,那么业务方法(service方法,一般我们把事务边界界定在service的方法开始和结束)调用结束后,事务结束了,相应的session也就关闭了,而如果用OSIV的话,那么我们的事务边界就是请求开始和请求结束,这样在视图渲染的过程中,事务还是开启的,那么与事务关联的session也还是打开的,当然就可以渲染视图了。OSIV的主要目的也就是为了渲染视图,以防止加载进的数据对渲染视图没作用。

[该贴被xmuzyu于2008-09-10 16:27修改过]

lgx522
2009-01-07 15:30
最近在做Spring Remoting+Applet,本以为脱离了Web就可以大吉了,没想到即使是Remoting,“open session in view”还是个大问题。

猜你喜欢
2Go 上一页 1 2