Spring与Hibernate整合:OpenSessionInViewFilter对session生命周期的控制
"在Hibernate与Spring集成的Web应用中,Session的生命周期管理是一项关键任务。标题所指的'过滤器对于session周期的控制',主要讨论的是如何通过OpenSessionInView策略来确保在处理HTTP请求时,能够有效地管理Hibernate Session的创建、关闭和重用,尤其是在使用Spring和Web框架(如Webwork)的情况下。 首先,理解OpenSessionInView模式是关键。这个模式的主要目的是在HTTP会话的整个生命周期内保持一个持久的Hibernate Session打开,避免频繁地创建和关闭Session,从而提高性能并减少数据一致性问题。当一个用户请求进入,OpenSessionInViewFilter会在请求开始时自动创建一个Session,并将其绑定到该请求,直到请求结束才会关闭。这样,后续的操作可以无需每次都手动打开新的Session,特别是对于懒加载(lazy=true)的关联对象,它们在需要时会被自动加载,无需额外的Session操作。 在Spring和Hibernate整合中,如Spring Boot或Spring MVC中,通常会使用Spring提供的OpenSessionInViewFilter。配置这个过滤器时,需要注意以下几点: 1. `<filter-class>`标签指定了filter的具体实现类`org.springframework.orm.hibernate3.support.OpenSessionInViewFilter`,这是Spring对Hibernate开放Session支持的核心组件。 2. `<init-param>`标签用于设置filter的初始化参数,例如: - `singleSession`:设置是否为单例模式,如果为true,意味着在整个请求中只有一个Session,这有助于优化性能。 - `sessionFactoryBeanName`:指定Spring中的SessionFactory bean名称,即已经配置好的Hibernate SessionFactory实例。 3. 在Web.xml中,`<filter-mapping>`标签用于将过滤器映射到特定的URL模式。在这个例子中,`<url-pattern>/*</url-pattern>`表示应用的所有URL都会应用这两个过滤器。 4. 对于Webwork,虽然它有自己的Dispatcher,但OpenSessionInViewFilter通常需要放在Struts2的filter之前,确保在处理请求前就创建了Session,以避免Webwork Filter中的Session创建延迟导致的问题。 总结来说,控制session周期的关键在于合理使用OpenSessionInViewFilter,通过配置使其与Spring的SessionFactory协作,确保在Web应用中提供一致且高效的Session管理。同时,了解各个框架的生命周期和请求处理流程,可以帮助我们更准确地定位和调整过滤器的设置,以满足应用程序的需求。"
当hibernate+spring配合使用的时候,如果设置了lazy=true,那么在读取数据的时候,当读取了父数据后,hibernate会自动关闭session,这样,当要使用子数据的时候,系统会抛出lazyinit的错误,这时就需要使用spring提供的 OpenSessionInViewFilter,
OpenSessionInViewFilter主要是保持Session状态知道request将全部页面发送到客户端,这样就可以解决延迟加载带来的问题
3、说说Webwork中使用OpenSessionInView的注意事项
web.xml中的配置要注意先后顺序,OpenSessionInViewFilter要在struts2的filter前面,(这个是为什么呢?)否则系统会报错。
代码
<filter>
<filter-name>opensession</filter-name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
<init-param>
<param-name>singleSession</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>sessionFactoryBeanName</param-name>
<param-value>mySessionFactory</param-value>
</init-param>
</filter>
<filter>
<filter-class>com.opensymphony.webwork.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>opensession</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>webwork</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
对于OpenSessionInView的配置中,singleSession应该设置为true(在哪儿设置呢?),表示一个request只能打开一个 session,如果设置为false的话,session可以被打开多个,这时在update、delete的时候会出现打开多个session的异常。
用了OpenSessionInView的缺点:
但是当设置为true的时候,系统的性能会因为用户的网络状况受到影响,当request在生成页面完成后,session才会被释放,所以如果用户的网络状况比较差,那么连接池中的链接会迟迟不被回收,造成内存增加,系统性能受损。但是如果不用这种方法的话,lazy模式有体现不出它的优点,用?不用?两难啊
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
在没有使用Spring提供的Open Session In View情况下,因需要在service(or Dao)层里把session关闭,所以lazy loading 为true的话,要在应用层内把关系集合都初始化,如 company.getEmployees(),否则Hibernate抛session already closed Exception; Open Session In View提供了一种简便的方法,较好地解决了lazy loading问题.
它有两种配置方式OpenSessionInViewInterceptor和OpenSessionInViewFilter(具体参看SpringSide),功能相同,只是一个在web.xml配置,另一个在application.xml配置而已。
剩余10页未读,继续阅读
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- C++标准程序库:权威指南
- Java解惑:奇数判断误区与改进方法
- C++编程必读:20种设计模式详解与实战
- LM3S8962微控制器数据手册
- 51单片机C语言实战教程:从入门到精通
- Spring3.0权威指南:JavaEE6实战
- Win32多线程程序设计详解
- Lucene2.9.1开发全攻略:从环境配置到索引创建
- 内存虚拟硬盘技术:提升电脑速度的秘密武器
- Java操作数据库:保存与显示图片到数据库及页面
- ISO14001:2004环境管理体系要求详解
- ShopExV4.8二次开发详解
- 企业形象与产品推广一站式网站建设技术方案揭秘
- Shopex二次开发:触发器与控制器重定向技术详解
- FPGA开发实战指南:创新设计与进阶技巧
- ShopExV4.8二次开发入门:解决升级问题与功能扩展