首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java Web开发 >

关于spring中的open session in view?该怎么解决

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

关于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);

热点排行