Open Session in View
我们在使用Hibernate的lazy load来优化性能的时候,只要Session关闭后再试图访问未被载入的对象时,
就会出现异常。通常使用在事务之内来访问数据是适合的,但是有时候我们需要强制载入这些数据,例
如在Web视图中访问这些模型对象。
在业务层强制载入这些数据,通常不是很好的解决方案,因为不同的视图在使用业务方法的时候,需要的数据
通常不一样,这样业务方法可能绑定到特定的控制器中。
在业务层上面增加一个Facade层来解决这个问题,同样也会增加一层不太必要的封装,增加了复杂性,POJO in Action一书中的例子就是这么设计的(POJO in Action感觉是本蛮不错的书),详细的可以看看这本书。
通常Open Session in View模式相对来说是个不错的解决方案。事务在服务层结束,但关联的Hibernate Session保持打开状态,直到视图生成完成为止。这样及早的释放了数据库锁和连接,并且视图中可以通过lazy load来加载。
Spring支持这种即开即用的模式,通过org.springframework.orm.hibernate.support.OpenSessionInViewFilter(可以和任何web层技术一起使用)或者OpenSessionInViewInterceptor(和Spring的Web MVC框架一起使用)。
Spring的这两种实现,他们支持两种操作方式:单一会话模式和延迟关闭模式
1、单一会话模式:
通过在请求范围的Session上来操作事务,单个Hibernate Session将用于整个HTTP请求。
默认情况下是单一会话方式,它是Open Session in View比较有效的版本。请求范围内的Hibernate Session视为第一级缓存,整个请求内只载入每个持久性对象一次。主要的缺点是:所有的Session管理的对象都必须是唯一的,这样视图从HttpSession中重新attach一个对象,可能导致Hibernate重复对象的异常。
2、延迟关闭方式:
每个事务将和平常一样使用其自身的Session,但这些Session中的每一个都在事务完成后保持开启,在视图生成后关闭。这样可以通过使用新的Hibernate Session来避免重复对象的问题,所有Session都在事务完成后保持开启,在他们每个上允许lazy load。但是,如果单个持久性对象涉及到多个事务,可能导致问题。Hibernate需要一个持久化对象与一个Hibernate Session关联,而不是同时与多个。这种情况下应该使用单一会话模式。
在web.xml中配置:
< filter-name > OpenSessionInView </ filter-name >
< filter-class > org.springframework.orm.hibernate.support.OpenSessionInVewFilter </ filter-class >
<!-- 如果使用延迟关闭方式
<init-param>
<param-name>singleSession</param-name>
<param-value>false</param-value>
</init-param>
-->
</ filter >
< filter-mapping >
< filter-name > OpenSessionInView </ filter-name >
< url-pattern > *.do </ url-pattern > <!-- 以.do结束的的url为例 -->
</ filter-mapping >
OpenSessionInViewInterceptor的配置Spring Web MVC:
< property name ="sessionFactory" >
< ref bean ="sessionFactory" >
</ property >
<!-- 如果使用延迟关闭方式
<property name="singleSession">
<value>false</value>
</property>
-->
</ bean >
< bean id ="myUrlMapping" class ="org.springframeword.web.servlet.handler.SimpleUrlHandlerMapping" >
< property name ="interceptors" >
< list >
< ref bean ="openSessionInView" >
</ list >
</ property >
< property name ="urlMap" >
<!-- url mappings -->
</ property >
</ bean >
Open Session in View相关推荐
- open Session In View和过滤器配置
Open Session In View模式的主要思想是:当Web Request(浏览器请求)开始时,自动打开Session,当Web Request结束时,自动关闭Session.也就是说,Ses ...
- open session and Hibernate事务处理机制
相关文章: Hibernate入门 - Transaction 使用OpenSessionInView模式时的一个异常问题解决方法 推荐圈子: 青岛javaeye 更多相关推荐 在没有使用Spring ...
- 【Session】Tomcat中Session持久化到文件系统或数据库
参考的优秀文章 Tomcat Session 持久化 Package org.apache.catalina.session 最近同事在做Session外置的功能,我对Session持久化.共享也不太 ...
- Lumen中启用session
原文链接:http://www.jianshu.com/p/dc33f8ab0618 Lumen5.2 的Release Notes中官方明确的指出Lumen专注于构建无状态API,JSON API ...
- 将登录等信息保存到session中和退出session
做项目时,可能会将某些信息保存在session中,如登录等信息,这样方便在某些页面使用这些保存的信息. 要想保存这些信息,需要创建一个类,该类里面定义需要保存的变量等信息,当登录后就通过new一个该类 ...
- [K/3Cloud] 调用其他界面时通过Session传递对象参数
DynamicFormShowParameter参数的CustomParams参数列表只支持string类型的参数,对于复杂参数的传递需要通过单据View对象的共享Session来完成,如: 在调用界 ...
- PHP函数源码之SESSION实现机制
Session是以扩展的形式嵌入到PHP内核的,所以我们可以把Session当成扩展来看待. 一般扩展被载入到PHP会经过下面几个过程 [cpp] view plaincopy #define PHP ...
- [精]Odoo 8.0深入浅出开发教程-模块开发基础
參考资料点击这里. 构建Odoo模块 模块组成 业务对象 业务对象声明为Python类, 由Odoo自己主动加载. 数据文件 XML或CSV文件格式, 在当中声明了元数据(视图或工作流).配置数据(模 ...
- 使用FortJs使用现代JavaScript开发Node.js
介绍 (Introduction) Nodejs gives you the power to write server side code using JavaScript. In fact, it ...
最新文章
- 20165303我期望的师生关系
- 正则 ?= 和 ?= 用法 以及零宽断言等概念
- TIMING_05 VIVADO环境下的时序约束 之 基本时钟周期约束
- 五、华为鸿蒙HarmonyOS应用开发之Java开发模式下的同一个 Page 里实现页面跳转时无参(有参)传递、回值详解
- 重新拎一遍js的正则表达式
- Identity Server 4 原理和实战(完结)_建立Angular 客户端
- 教你炒股票21:缠中说禅买卖点分析的完备性
- 【维修】【硬件】【苹果】wifi芯片被加密
- Android编译gradle提示A problem occurred evaluating project ':example'.
- [Android6.0][MTK6737] 修改默认允许位置来源第三方应用安装
- 7z和winrar命令行压缩方法
- Mac安装jekyll踩坑
- 拥有十多年欧美金融行业经验,他曾任硅谷Top2互联网金融公司Prosper核心高管,突然回国,究竟是为何?
- 最近在读的一些文章-2019.04
- 驱动谷歌浏览器执行用例时报错java.lang.IllegalStateException
- TCAM CAM 说明 原理 结构 Verilog 硬件实现
- 总在说双亲委派,但双亲委派是什么,双亲委派和类加载的关系,简单讲解
- 电商系统-优惠券部分设计
- 淘宝二维码对网店推广的好处
- LYSoft之QQ去广告+本地会员外挂原理