`

Spring配置之OpenSessionInViewFilter和OpenSessionInViewInterceptor

阅读更多

主要涉及类:
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor

一、作用
    说明一下Open Session in View的作用,就是允许在每次的整个request的过程中使用同一个hibernate session,可以在这个request任何时期lazy loading数据。
如果是singleSession=false的话,就不会在每次的整个request的过程中使用同一个hibernate session,而是每个数据访问都会产生各自的seesion,等于没有Open Session in View.
OpenSessionInViewFilter默认是不会对session 进行flush的,并且flush mode 是 never

spring的OpenSessionInViewFilter过滤器,主要是为了实现Hibernate的延迟加载功能,基于一个请求一个hibernate session的原则。

二、配置
它有两种配置方式OpenSessionInViewInterceptor和OpenSessionInViewFilter(具体参看SpringSide),功能相同,只是一个在web.xml配置,另一个在application.xml配置而已。

Open Session In View在request把session绑定到当前thread期间一直保持hibernate session在open状态,使session在request的整个期间都可以使用,如在View层里PO也可以lazy loading数据,如 ${ company.employees }。当View 层逻辑完成后,才会通过Filter的doFilter方法或Interceptor的postHandle方法自动关闭session。
1,web.xml配置OpenSessionInViewFilter 注意:如果有struts filter,一定要发在struts filter之前

Xml代码  收藏代码
  1. <!--Hibernate Open Session in View Filte-->  
  2. <filter>  
  3.     <filter-name>hibernateFilter</filter-name>  
  4.     <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>  
  5.     <!-- singleSession默认为true,若设为false则等于没用OpenSessionInView -->  
  6.     <init-param>  
  7.         <param-name>singleSession</param-name>  
  8.         <param-value>true</param-value>  
  9.     </init-param>  
  10. </filter>  
  11. <filter-mapping>  
  12.     <filter-name>hibernateFilter</filter-name>  
  13.     <url-pattern>/*</url-pattern>  
  14. </filter-mapping>   


2,applicationContext.xml配置openSessionInViewInterceptor

Xml代码  收藏代码
  1. <bean id="openSessionInViewInterceptor"  
  2.     class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">  
  3.     <property name="sessionFactory" ref="sessionFactory" />  
  4. </bean>  



三、注意
尽 管Open Session In View看起来还不错,其实副作用不少。看回上面OpenSessionInViewFilter的doFilterInternal方法代码,这个方法 实际上是被父类的doFilter调用的,因此,我们可以大约了解的OpenSessionInViewFilter调用流程:

request(请求)->open session并开始transaction->controller->View(Jsp)->结束transaction并 close session.

一切看起来很正确,尤其是在本地开发测试的时候没出现问题,但试想下如果流程中的某一步被阻塞的话,那在这期间connection就一直被占用 而不释放。最有可能被阻塞的就是在写Jsp这步,一方面可能是页面内容大,response.write的时间长,另一方面可能是网速慢,服务器与用户间 传输时间久。当大量这样的情况出现时,就有连接池连接不足,造成页面假死现象。

Open Session In View是个双刃剑,放在公网上内容多流量大的网站请慎用 

分享到:
评论

相关推荐

    spring面试大全

    5. **对象管理**:Spring 提供了一种集中化的对象管理方式,通过IoC容器来管理对象的生命周期和装配,简化了对象的创建和配置。 6. **ORM框架支持**:Spring 对许多Object-Relational Mapping (ORM)框架,如...

    spring面试题大全.doc

    - **对象管理**:Spring 提供了统一的对象管理方式,简化了对象的生命周期管理和配置。 **2. 实现依赖注入(DI)的三种方式** - **接口注入**:通过实现特定接口,依赖对象在运行时被自动注入。 - **Setter 注入**...

    Spring面试题大全

    3. 在使用中如果遇到OpenSessionInView的问题,可以添加OpenSessionInViewFilter或OpenSessionInViewInterceptor。 五、Spring的事务管理 Spring框架提供了事务管理机制,提供了几个关于事务处理的类: 1. ...

    spring面试题大全

    4. 解决OpenSessionInView问题,可以使用OpenSessionInViewFilter或OpenSessionInViewInterceptor,确保在一次HTTP请求中保持Hibernate Session的开放状态,以解决懒加载异常。 Spring的事务管理分为编程式和声明式...

    spring面试题集

    当遇到OpenSessionInView问题时,可以使用OpenSessionInViewFilter或OpenSessionInViewInterceptor来解决。 Spring的事务管理提供了强大且灵活的机制,主要包括编程式和声明式两种方式: 1. 编程式事务管理:通过...

    java-spring面试题大全

    - 解决OpenSessionInView问题,可以使用OpenSessionInViewFilter或OpenSessionInViewInterceptor,确保在HTTP请求的整个生命周期中都保持数据库会话。 5. **Spring的事务管理**: - Spring提供了...

    面试知识点总结--spring面试题大全.pdf

    总的来说,Spring框架通过其强大的功能和设计理念,极大地简化了Java后端开发,提高了代码的可维护性和可扩展性,是现代企业级应用的首选框架之一。在面试中,对这些核心概念的深入理解和应用展示,将有助于求职者...

    spring面试题

    - **OpenSessionInView**:解决长时间请求导致的事务问题,可通过添加 OpenSessionInViewFilter 或 OpenSessionInViewInterceptor。 5. **Spring 事务管理** - **TransactionDefinition**:定义事务属性,如隔离...

    使用Spring引起的错误

    ### 使用Spring引起的错误:Write ...通过以上解决方案和配置示例,可以有效地解决在使用Spring框架和Hibernate时出现的“Write operations are not allowed in read-only mode (FlushMode.NEVER)”这一问题。

    SPRING API 2.0.CHM

    OpenSessionInViewInterceptor OpenSessionInViewInterceptor OptimisticLockingFailureException OptionsTag OptionTag OptionWriter OracleLobHandler OracleLobHandler.LobCallback ...

    HibernateSpring多数据库解决方案.doc

    此外,Spring的`OpenSessionInViewFilter`或`OpenSessionInViewInterceptor`模式常用于Web应用,它能在HTTP请求的生命周期内保持一个Hibernate Session,以处理跨多个DAO方法的事务。然而,这种模式在多数据库的情况...

    Hibernate事务管理.

    `OpenSessionInViewInterceptor`是在Spring的MVC环境中配置的拦截器,它需要在`SimpleUrlHandlerMapping`中定义并添加到拦截器列表中。配置示例如下: ```xml &lt;bean name="openSessionInViewInterceptor" class=...

    Open_Session_In_View详解.doc

    &lt;bean name="openSessionInViewInterceptor" class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor"&gt; &lt;bean id="urlMapping" class="org.springframework.web.servlet....

    spring中lazy=“true”的正常读取关联表(用opensessioninview)

    为了解决这个问题,Spring提供了一个过滤器 `OpenSessionInViewFilter` 或者 `OpenSessionInViewInterceptor`,通常简称为OSIV(Open Session In View)模式。 OSIV模式的核心思想是在Controller层和View层之间保持...

Global site tag (gtag.js) - Google Analytics