细说OpenSessionInView问题
【环境参数】
环境:SSH框架
【问题描述】
NoSession问题
HibernateTemplate对象提供的方法如果使用“延迟加载”,Session对象的管理不受开发者控制,此时如果在表现层获取延迟加载的数据,
则会抛出“LazyInitializationException”异常,如下图所示。
【原因分析】
原因总结:Session的存活期太短,在Session已经关闭的情况下,App读取持久化对象中的非OID的属性从而报错。
假设load()方法获得的对象是User对象。
“延迟加载”的特点:
在Hibernate没有关闭Session时,App可以随时去读取“延迟数据(通过让Hibernate重新加载去获得数据)”。
load()方法获得的User对象是一个“只有ID属性”的对象,只要App不去使用User对象中的“非ID属性”,则User对象中永远都只有ID属性,这样可以提高性能。
当App去调用对象X中的非ID属性时,比如name和age属性,正常情况下,Hibernate会去加载name和age属性,然后JVM再调用toString()方法,并且成功地完成打印。
但若在Hibernate去加载name和age属性时,Session已经关闭了,则Hibernate就无法去加载得到非ID属性了,此时就会抛出异常“LazyInitializationException”。
Session为什么会关闭呢?
当我们提交事务时,就会自动把Session给关闭了。
【解决方案】
该解决方案由Spring提供:OpenSessionInView。
(1)主要思路
将Session的存活期延长,绑定Session。
(2)产生该方案的思路
客户端发一个请求,则位于服务器端的Spring创造一个Session,当请求结束了,才会把Session关闭,这样,就将Session与请求绑定在一起了。
从发送请求到请求结束,这整个流程都位于一个线程,在此,将Session对象绑定到该线程上,在Hibernate知识体系中,就有一个关于“当前线程绑定Session”的专题,讲的也就是这个概念。
客户端每次发送请求时,都要去将Session绑定到线程上,这样比较麻烦,能否有简化途经呢?比如Spring的AOP。
1)可选方案一:利用Spring的AOP。
方案一可行性:不靠谱。
为什么方案一不行?
因为在客户端发送的请求在到达服务器的过程中,Spring还没有开始工作。Spring若想绑定东西,要绑定的东西必须是“代码”,
“请求对象和响应对象的创建”是由服务器端的HTTPD守护程序完成的。而Spring是位于Web容器中的,而且Spring容器随着某个WebApp的启动而创建的。此时Spring还没有开始工作,而请求对象已经被HTTPD守护程序创建了,此时,Spring是不可能将Request对象同Session对象进行绑定的,因此,AOP是不能完成该功能的。
2)可选方案二:利用监听器
方案二可行性:不靠谱。
<listener>监听器:监听器是启动服务器时一次性运行的。
3)可选方案三:利用过滤器
<filter>过滤器:过滤器是每当用户的请求Request对象到达WebApp时以及Response对象出WebApp时使用的。
(3)终极解决方案
1)简述:OpenSessionInView翻译过来就是:在表现层打开Session。
2)作用:
将Session对象的创建交给当前线程管理,当前线程维护着一个“Session的连接池”。每当用户发送一个请求,filter在接收到用户的请求Request后,就会将Session对象绑
定到该请求上。
当请求被处理完毕,返回响应Response时,Response会再次经过filter的处理,Response之前被绑定的Session会被filter回收,然后放入到“Session的连接池”中。
当下次用户再次发送请求时,仍然重复上述过程。
3)代码:
在web.xml中设置过滤器OpenSessionInViewFilter。
<!-- 配置OpenSessionInView -->
<filter>
<filter-name>openSessionInView</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>openSessionInView</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
读者如要转载,请标明出处和作者名,谢谢。
地址01:http://space.itpub.net/25851087
地址02:http://www.cnblogs.com/zjrodger
作者名:zjrodger
细说OpenSessionInView问题的更多相关文章
- [转]细说OpenSessionInView问题
转载:https://www.cnblogs.com/zjrodger/p/4615809.html. [环境参数] 环境:SSH框架 [问题描述] NoSession问题 HibernateTem ...
- 匹夫细说C#:庖丁解牛迭代器,那些藏在幕后的秘密
0x00 前言 在匹夫的上一篇文章<匹夫细说C#:不是“栈类型”的值类型,从生命周期聊存储位置>的最后,匹夫以总结和后记的方式涉及到一部分迭代器的知识.但是觉得还是不够过瘾,很多需要说清楚 ...
- 细说WebSocket - Node篇
在上一篇提高到了 web 通信的各种方式,包括 轮询.长连接 以及各种 HTML5 中提到的手段.本文将详细描述 WebSocket协议 在 web通讯 中的实现. 一.WebSocket 协议 1. ...
- 匹夫细说C#:委托的简化语法,聊聊匿名方法和闭包
0x00 前言 通过上一篇博客<匹夫细说C#:庖丁解牛聊委托,那些编译器藏的和U3D给的>的内容,我们实现了使用委托来构建我们自己的消息系统的过程.但是在日常的开发中,仍然有很多开发者因为 ...
- 细说Java主流日志工具库
概述 在项目开发中,为了跟踪代码的运行情况,常常要使用日志来记录信息. 在Java世界,有很多的日志工具库来实现日志功能,避免了我们重复造轮子. 我们先来逐一了解一下主流日志工具. java.util ...
- 细说 Form (表单)
细说 Form (表单) Form(表单)对于每个WEB开发人员来说,应该是再熟悉不过的东西了,可它却是页面与WEB服务器交互过程中最重要的信息来源. 虽然Asp.net WebForms框架为了帮助 ...
- 细说ASP.NET Forms身份认证
阅读目录 开始 ASP.NET身份认证基础 ASP.NET身份认证过程 如何实现登录与注销 保护受限制的页面 登录页不能正常显示的问题 认识Forms身份认证 理解Forms身份认证 实现自定义的身份 ...
- 细说CSS选择器
众所周知,CSS的一个核心特征就是能向文档中的一组元素类型应用某些规则.每个规则都有两个基本部分:选择器(selector)和声明块(declaration block).下图显示了规则的各个部分. ...
- [转]细说Redis监控和告警
原文 https://zhuoroger.github.io/2016/08/20/redis-monitor-and-alarm/? 对于任何应用服务和组件,都需要一套完善可靠谱监控方案. 尤其r ...
随机推荐
- Android Camera 使用小结
Android手机关于Camera的使用,一是拍照,二是摄像,由于Android提供了强大的组件功能,为此对于在Android手机系统上进行Camera的开发,我们可以使用两类方法:一是借助Inten ...
- linux字符驱动程序结构
linux内核为字符设备的驱动程序设计,提供了一些数据结构,和函数,供开发人员调用,将设备驱动程序注册到内核去.现代操作系统几乎都不直接和硬件通信,而是通过定义的接口,是硬件厂商自己来开发符合标准某个 ...
- VFL示例
•[cancelButton(72)]-12-[acceptButton(50)] •取消按钮宽72point,accept按钮宽50point,它们之间间距12point • •[wideView( ...
- VS启用IIS调试的方法及可能碰到的问题。
经常有这种情况, 开发机本地正常, 但是一旦发布到服务上后, 就出现各种问题. 这是由于开发机和服务器环境不一样造成的, 所以开发时要尽可能的模拟真实性. 这时候, VS的这个功能就帮大忙了. 如何 ...
- 一个基于WebGL的仿真3D水池有逼真的水波纹效果
最近在研究WebGL,看到国外很多高手做的很多超炫的3D效果,无比羡慕.忍不住把效果趴下来研究,下面介绍一个逼真的游泳池中浮动小球的效果.效果非常绚丽,功能强大.示例可切换观察水池的视角,不同视角考虑 ...
- Spring aop 实现异常拦截
使用aop异常挂载功能可以统一处理方法抛出的异常,减少很多重复代码,实现如下: 1.实现ThrowAdvice public class ExceptionHandler implements Thr ...
- iOS NSString的常用用法
//1.创建常量字符串. NSString *astring = @"This is a String!"; //2.创建空字符串,给予赋值. NSString *astrin ...
- ios 页面传值4种方式(一) 之全局变量
通用的是用代理的方式实现页面传值,但是有时候利用其它方式也可以很巧妙的解决问题,页面传值一共有4种方式: 1.使用全局变量, SharedApplication,定义一个变量来传递. 2.使用文件,或 ...
- C/C++中static关键字详解-zz
静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可以改变其值. 静态变量或静态函数只有本文件内的代码才能访问它,它的名字在其它文件中不可见.用法1:函数内部声明 ...
- RandomAcessFile、MappedByteBuffer和缓冲读/写文件
项目需要进行大文件的读写,调查测试的结果使我决定使用MappedByteBuffer及相关类进行文件的操作,效果不是一般的高. 网上参考资源很多,如下两篇非常不错: 1.花1K内存实现高效I/O的Ra ...