转载:https://www.cnblogs.com/zjrodger/p/4615809.html

【环境参数】

  环境: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>
</filter>

转载:https://www.cnblogs.com/zjrodger/p/4615809.html

[转]细说OpenSessionInView问题的更多相关文章

  1. 细说OpenSessionInView问题

    [环境参数] 环境:SSH框架 [问题描述]  NoSession问题 HibernateTemplate对象提供的方法如果使用“延迟加载”,Session对象的管理不受开发者控制,此时如果在表现层获 ...

  2. 匹夫细说C#:庖丁解牛迭代器,那些藏在幕后的秘密

    0x00 前言 在匹夫的上一篇文章<匹夫细说C#:不是“栈类型”的值类型,从生命周期聊存储位置>的最后,匹夫以总结和后记的方式涉及到一部分迭代器的知识.但是觉得还是不够过瘾,很多需要说清楚 ...

  3. 细说WebSocket - Node篇

    在上一篇提高到了 web 通信的各种方式,包括 轮询.长连接 以及各种 HTML5 中提到的手段.本文将详细描述 WebSocket协议 在 web通讯 中的实现. 一.WebSocket 协议 1. ...

  4. 匹夫细说C#:委托的简化语法,聊聊匿名方法和闭包

    0x00 前言 通过上一篇博客<匹夫细说C#:庖丁解牛聊委托,那些编译器藏的和U3D给的>的内容,我们实现了使用委托来构建我们自己的消息系统的过程.但是在日常的开发中,仍然有很多开发者因为 ...

  5. 细说Java主流日志工具库

    概述 在项目开发中,为了跟踪代码的运行情况,常常要使用日志来记录信息. 在Java世界,有很多的日志工具库来实现日志功能,避免了我们重复造轮子. 我们先来逐一了解一下主流日志工具. java.util ...

  6. 细说 Form (表单)

    细说 Form (表单) Form(表单)对于每个WEB开发人员来说,应该是再熟悉不过的东西了,可它却是页面与WEB服务器交互过程中最重要的信息来源. 虽然Asp.net WebForms框架为了帮助 ...

  7. 细说ASP.NET Forms身份认证

    阅读目录 开始 ASP.NET身份认证基础 ASP.NET身份认证过程 如何实现登录与注销 保护受限制的页面 登录页不能正常显示的问题 认识Forms身份认证 理解Forms身份认证 实现自定义的身份 ...

  8. 细说CSS选择器

    众所周知,CSS的一个核心特征就是能向文档中的一组元素类型应用某些规则.每个规则都有两个基本部分:选择器(selector)和声明块(declaration block).下图显示了规则的各个部分. ...

  9. [转]细说Redis监控和告警

    原文  https://zhuoroger.github.io/2016/08/20/redis-monitor-and-alarm/? 对于任何应用服务和组件,都需要一套完善可靠谱监控方案. 尤其r ...

随机推荐

  1. springboot2 中Druid和ibatis(baomidou) 遇到org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.iflytek.pandaai.service.multi.mapper.TanancyMapper

    调用mapper中任何方法都会出现类似的错误 org.apache.ibatis.binding.BindingException: Invalid bound statement (not foun ...

  2. python3爬虫筛选所需要数据

    第一次使用博客园,也是第一篇文章,让我们一起开启学习之旅吧!! 昨天在为某授权系统做安全性测试的时候,可以未授权访问系统的用户登陆统计记录.由此想整理出部分用户名,作为暴力破解的用户名,检查是否存在用 ...

  3. Vue.js 源码分析(二十) 指令篇 v-once指令详解

    数据绑定最常见的形式就是使用“Mustache”语法 (双大括号) 的文本插值,例如:<p>Message: {{ msg }}</p>以后每当msg属性发生了改变,插值处的内 ...

  4. git同步本地数据到github——第一次使用和以后使用

    git作为版本控制工具十分的好用,但是在使用的过程中,会因为仓库版本的不同步出现很多错误 一.git简单的原理交互模型 从下面的model中我们看到在不创建分支情况下始终是远程的origin和本地的m ...

  5. 开源工作流引擎 Workflow Core 的研究和使用教程

    目录 开源工作流引擎 Workflow Core 的研究和使用教程 一,工作流对象和使用前说明 二,IStepBuilder 节点 三,工作流节点的逻辑和操作 容器操作 普通节点 事件 条件体和循环体 ...

  6. Java自学-集合框架 Collections

    Java集合框架 工具类Collections Collections是一个类,容器的工具类,就如同Arrays是数组的工具类 步骤 1 : 反转 reverse 使List中的数据发生翻转 pack ...

  7. ASP.NET Core系列:中间件

    1. 概述 ASP.NET Core中的中间件是嵌入到应用管道中用于处理请求和响应的一段代码. 2. 使用 IApplicationBuilder 创建中间件管道 2.1 匿名函数 使用Run, Ma ...

  8. 学习shiro第二天

    昨天讲了shiro的认证流程以及代码实现,今天将对这个进行扩展. 因为我们的测试数据是shiro.ini文件中配置的静态数据,但实际上数据应该从数据库中查询出来才合理,因此我们今天讲讲JdbcReal ...

  9. 怎么进入bios设置界面,电脑如何进入BIOS进行设置,怎么进入BIOS的方法集合

    怎么进入bios设置界面,电脑如何进入BIOS进行设置,怎么进入BIOS的方法集合 开机出现电脑商家图标时,按住F10键进入BIOS界面.进入BIOS界面一般都是开机后按<del,Esc,F1, ...

  10. Jenkins的CI持续集成

    Jenkins的CI持续集成 全局配置 系统管理->全局工具配置,配置Git,JDK和Maven 1)解压maven到当前目录 tar zxf apache-maven-3.5.4-bin.ta ...