日期:2014-05-18  浏览次数:20744 次

关于spring中的open session in view?
1.spring中的open session in view 是怎样的原理?有哪些实现方法?怎样使用?

2.在配置为延迟加载的时候,怎么样能够在view层拿到关联的数据,除了用open session in view,有没有更简单实用的方法来解决?因为我看到网上有说,open session in view 在访问量很大的时候,容易造成页面假死现象.

我在网上搜了一下,也没理解太清楚,有哪位高手能通俗易懂地讲一下

------解决方案--------------------
原理就是一个filter,每次request进来,就打开一个session放到ThreadLocal里,以后用到session就拿出来用,filter结束的时候,再清空ThreadLocal,关闭session。

在lazy-load的时候,如果不用osiv,你就需要自己控制session的打开与关闭,肯定是osiv更简单了,不用你自己去考虑什么时候打开session,什么时候处理session的关闭和资源释放。因为osiv会在每次请求的过程中占用一个session,如果这个请求过程太长,session就无法释放了。可以在tomcat前端加一个apache,讲网速太慢的请求隔离掉。
------解决方案--------------------
支持帮顶
我也在想这个问题
------解决方案--------------------
呵呵,楼主问了我一直想问的问题:>

spring和hibernate的wiki,还有javaeye有几篇osiv的文章,看来看去都不是太明白。

感觉没有太大的使用意义啊?view层要的数据还是得提前取出来。
另外看过别人说性能上也有问题。
------解决方案--------------------
1.spring中的open session in view 是怎样的原理?有哪些实现方法?怎样使用?

其实就是在filter里面开启session,代码都比较简单,就是
Session session = getSession(sessionFactory);之后调用
filterChain.doFilter(request, response);执行相关的action等,最后关闭session
SessionFactoryUtils.processDeferredClose(sessionFactory);当然里面还有另外一种情况,楼主可以看下源代码,网上似乎也有不少解释

你也可以自己做一个filter来模拟实现open session in view 功能,应该很简单

2.在配置为延迟加载的时候,怎么样能够在view层拿到关联的数据,除了用open session in view,有没有更简单实用的方法来解决?因为我看到网上有说,open session in view 在访问量很大的时候,容易造成页面假死现象. 

更简单的方法,就是最笨的方法
第一种,不用延迟
第二种,一般不推荐第一种,因为那样会有性能问题,查询多次影响性能;所以在查询的时候代码中只写用fetch来抓取,这个可以人为控制!
------解决方案--------------------
上面copy的有些问题,不是SessionFactoryUtils.processDeferredClose(sessionFactory)
关闭session是调用的closeSession(sessionHolder.getSession(), sessionFactory);

而closeSession方法就是用的hibernate的方法来关闭

SessionFactoryUtils.closeSession(session);