OpenSessionInView 的作用、配置及原理

C51:PWM+舵机角度控制 PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比,例如方波的占空比就是50%.脉冲宽度调制通过占空比编码模拟信号一个周期内,高电平占据时长的百分比如下图所示,最便宜的舵机sg90,常用三根或者四根接线,黄色为PWM信号控制。 阅读详情

hibernate 允许对关联对象、属性进行延迟加载,但是必须保证延迟加载的操作限于同一个 Hibernate Session 范围之内进行。如果 Service 层返回一个启用了延迟加载功能的领域对象给 Web 层,当 Web 层访问到那些需要延迟加载的数据时,由于加载领域对象的 Hibernate Session 已经关闭,这些导致延迟加载数据的访问异常。

把一个Hibernate Session和一次完整的请求过程对应的线程相绑定。目的是为了实现”Open Session in View”的模式。例如: 它允许在事务提交之后延迟加载显示所需要的对象。
OpenSessionInViewFilter 过滤器将 Hibernate Session 绑定到请求线程中,它将自动被 spring 的事务管理器探测到。所以 OpenSessionInViewFilter 适用于 Service 层使用HibernateTransactionManager 或 JtaTransactionManager 进行事务管理的环境,也可以用于非事务只读的数据操作中。

在不同的技术框架下,实现Open session in view的手段不同:
在servlet中用过滤器实现
在struts中用拦截器实现
在spring中使用AOP实现
这里给出在ssh框架中用spring的AOP实现:

配置:

<filter>  
        <filter-name>Spring OpenSessionInViewFilter</filter-name>  
        <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>  
     <init-param>  

<!--  
指定org.springframework.orm.hibernate3.LocalSessionFactoryBean在spring配置文件中的名称,默认值为sessionFactory  
     如果LocalSessionFactoryBean在spring中的名称不是sessionFactory,该参数一定要指定,否则会出现找不到sessionFactory的异常  
-->  
     <param-name>sessionFactoryBean</param-name>  
   <param-value>sessionFactory</param-value>  
  </init-param>  
    </filter>  
    <filter-mapping>  
        <filter-name>Spring OpenSessionInViewFilter</filter-name>  
        <url-pattern>/*</url-pattern>  
    </filter-mapping>  

原理:

protected void doFilterInternal(    
            HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)    
            throws ServletException, IOException {    
        SessionFactory sessionFactory = lookupSessionFactory(request);    
        boolean participate = false;    
        if (isSingleSession()) {    
            // single session mode    
            if (TransactionSynchronizationManager.hasResource(sessionFactory)) {    
                // Do not modify the Session: just set the participate flag.    
                participate = true;    
            }    
            else {    
                logger.debug("Opening single Hibernate Session in OpenSessionInViewFilter");    
                Session session = getSession(sessionFactory);    
                TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(session));    
            }    
        }    
        else {    
            // deferred close mode    
            if (SessionFactoryUtils.isDeferredCloseActive(sessionFactory)) {    
                // Do not modify deferred close: just set the participate flag.    
                participate = true;    
            }    
            else {    
                SessionFactoryUtils.initDeferredClose(sessionFactory);    
            }    
        }    
        try {    
            filterChain.doFilter(request, response);    
        }    
        finally {    
            if (!participate) {    
                if (isSingleSession()) {    
                    // single session mode    
                    SessionHolder sessionHolder =    
                            (SessionHolder) TransactionSynchronizationManager.unbindResource(sessionFactory);    
                    logger.debug("Closing single Hibernate Session in OpenSessionInViewFilter");    
                    closeSession(sessionHolder.getSession(), sessionFactory);    
                }    
                else {    
                    // deferred close mode    
                    SessionFactoryUtils.processDeferredClose(sessionFactory);    
                }    
            }    
        }    
    }    
protected void doFilterInternal(HttpServletRequest request,  
        HttpServletResponse response, FilterChain filterChain)  
        throws ServletException, IOException {  
    /** 
     * 从spring的上下文中取得SessionFactory对象 
     * WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext()); 
     * return (SessionFactory) wac.getBean(getSessionFactoryBeanName(),SessionFactory.class); 
     * getSessionFactoryBeanName()方法默认返回"sessionFactory"字符串,在spring配置文件中可要注意了,别写错了. 
     */  
    SessionFactory sessionFactory = lookupSessionFactory(request);  
    boolean participate = false;// 标识过滤器结束时是否进行关闭session等后续处理  
    if (isSingleSession()) {//单session模式  
        //判断能否在当前线程中取得sessionFactory对象对应的session  
        if (TransactionSynchronizationManager.hasResource(sessionFactory)) {  
            //当能够找到session的时候证明会有相关类处理session的收尾工作,这个过滤器不能进行关闭session操作,否则会出现重复关闭的情况.  
            participate = true;//但我并没有想出正常使用的情况下什么时候会出现这种情况.  
        } else {  
            Session session = getSession(sessionFactory);//当前线程取不到session的时候通过sessionFactory创建,下面还会详细介绍此方法  
            //将session绑定到当前的线程中,SessionHolder是session的一层封装,里面有个存放session的map,而且是线程同步的Collections.synchronizedMap(new HashMap(1));  
            //但是单session模式下一个SessionHolder对应一个session,核心方法是getValidatedSession 取得一个open状态下的session,并且取出后从map中移出.  
            TransactionSynchronizationManager.bindResource(sessionFactory,  

             new SessionHolder(session));  
    }  
} else {//这段是非单session模式的处理情况,没有研究.但粗略看上去,大概思想是一样的  
    if (SessionFactoryUtils.isDeferredCloseActive(sessionFactory)) {  
        participate = true;  
    } else {  
        SessionFactoryUtils.initDeferredClose(sessionFactory);  
    }  
}  
try {  
    //将session绑定到了当前线程后,就该处理请求了  
    filterChain.doFilter(request, response);  
}finally {  
    if (!participate) {  
        if (isSingleSession()) {  
            //当请求结束时,对于单session模式,这时候要取消session的绑定,因为web容器(Tomcat等)的线程是采用线程池机制的,线程使用过后并不会销毁.  
            SessionHolder sessionHolder = (SessionHolder) TransactionSynchronizationManager  
                    .unbindResource(sessionFactory);  
            //取消绑定只是取消session对象和线程对象之间的引用,还没有关闭session,不关闭session相对于不关闭数据库连接,所以这里要关闭session  
            closeSession(sessionHolder.getSession(), sessionFactory);  
        } else {  
            //非单session模式,没有研究.  
            SessionFactoryUtils.processDeferredClose(sessionFactory);  
        }  
    }  
}  

步骤:
1. 获取session,打开session
2. filterChain.doFilter(request, response);
3. 关闭session
在2中可能执行了若干的Servlet、JSP、Action等等,最终处理完渲染完页面之后,再进入OpenSessionInViewFilter的3关闭session
现在只要保证在2中不论是Servlet、JSP还是Action中执行DAO时获取的session都是1中打开的同一个session,并且在DAO关闭session时并不实际关闭,留到OpenSessionInViewFilter的3中再最终关闭,就实现了懒加载了,因为只要是在OpenSessionInViewFilter过滤的范围内,session都处于打开,比如在一个Servlet中查到一个Bean,这时他的关联实体并没有加载,当这个Servlet重定向到一个JSP,在其中得到这个Bean后直接访问之前没加载的那些关联实体,会实时的加载这个关联实体,因为session还未关闭,这便是懒加载了。

更多学习交流,请加群(非诚勿扰):
这里写图片描述

20、基于图神经网络的脱氢焓预测方法研究 本文研究了基于图神经网络(GNN)的液态有机氢载体(LOHC)材料脱氢焓预测方法。通过分析现有GNN方法的局限性,提出了一种新的聚合自节点表示(AWS)方法,并结合丰富的原子特征和集成学习策略,显著提高了预测性能。实验结果表明,AWS在脱氢焓预测和多个基准化学性质预测任务中均优于现有GNN方法。此外,基于分子结构的集成方法进一步提升了模型的鲁棒性和准确性。研究展示了该方法在筛选LOHC材料中的潜力,并为未来预测更多化学性质奠定了基础。 阅读详情

相关推荐

使用 ChatGPT/Copilot 提升前端开发效率的 N 种方式

typescript// 输入:根据这个 JavaScript 对象,生成完整的 TypeScript 类型定义id: '123',stock: 50,},// ChatGPT 生成:id: string;discount?: number;// 可选属性// 只读属性// 更进一步,生成 Zod schema 用于运行时验证:});}),});AI 代码助手真正的革命性不在于它能生成多少代码,而在于它改变了我们解决问题的方式。

fineday 1591

Spring的open-in-view(Open Session In View)指南

每个请求一个会话是一种将持久性会话和请求生命周期联系在一起的事务模式。 不出所料,Spring 自带这种模式的实现,名为 OpenSessionInViewInterceptor, 方便使用惰性关联,从而提高开发人员的工作效率....

白石的专栏 4686

基于Python的农业市场价格抓取与供需分析:现代爬虫技术与实战应用

在正式开始爬虫开发之前,我们首先了解爬虫的基本概念和工作原理。爬虫(Web Scraping)是通过编程的方式,自动从互联网上获取信息的技术。它可以帮助我们提取HTML页面中的特定数据,通常用于收集并处理大量信息。发送HTTP请求:爬虫需要向目标网站发送请求,获取网站的HTML页面内容。解析HTML页面:通过HTML解析器对获取的页面内容进行解析,提取其中需要的数据。数据清洗与存储:将提取的数据进行清洗,去除多余的字符或无关内容,然后存储到合适的格式(如CSV文件、数据库等)中。数据分析与可视化。

2201_76125261的博客 1117

OpenSessionInView模式

一 在Hibernate中实现DAO时,获取Session的方式要改变 1. openSession 从字面上可以看得出来,是打开一个新的session对象,而且每次使用都是打开一个新的session, 假如连续使用多次,则获得的session不是同一个对象,并且使用完需要调用close方法关闭session。 2. getCurrentSession,从字面上可以看得出来,是获取当前上下文一个session对象,当第一次使用此方法时, 会自动产生一个session对象,并且连续使用多次时,得到的s

琅枫的博客 859

24年电赛H题 | 想要小车走直线,正在调角度环,但不知道怎么把角度偏航角偏差转化成电机速度输出?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1313

yolov26改进 | 检测头篇 | 利用渐近特征金字塔网络AFPN改进yolov26检测头融合P2网络结构(让小目标无所遁形,全网独家首发)

本文介绍一种基于AFPN渐近特征金字塔网络改进的YOLOv26四检测头Detect_FPN。AFPN通过逐级融合底层细节、中层结构与高层语义特征,缩小不同尺度特征之间的语义差距,减少直接融合带来的信息冲突,使检测头获得更稳定、更充分的多尺度表达。本文进一步增加高分辨率小目标检测分支,强化对微小目标、密集目标和复杂背景目标的感知能力,适合工业缺陷、遥感及无人机等场景。文中将展示基础模型与改进模型的训练对比结果,并提供完整代码、配置文件、模块注册方法及Codex修改思路,方便直接复现和二次创新。

Snu77的博客 371

OpenSessionInView

在实际的业务开发中,访问数据库的操作肯定是很频繁的,意味我们可以将数据库访问的相关代码进行封装调用,减少代码冗余。 使用ThreadLocal存储SqlSession 使用MyBatis访问数据库,生成SqlSession的部分是通用的流程,我们可以对其进行封装,将其封装成MyBatisUtil类,对外提供获取SqlSession和关闭SqlSession的方法。 package com.test.util; import java.io.IOException; import java.io.Input

is_Javaer的博客 295

SAP_PP模块跑完 MRP,MD04 里却看不到“计划订单”?排查这 3 个最容易被忽略的主数据参数

MRP 是 SAP 逻辑最严密的模块之一,它绝不会随机罢工。当 MD04 里看不到计划订单时,请不要怀疑系统的计算能力。99% 的情况,都是因为我们给系统下达了矛盾的指令:一边告诉它“我有需求”,一边却通过主数据告诉它“不要计划”、“不要触发”或者“我是冻结的”。掌握这 3 个排查点,你就能在 5 分钟内解决大部分“MRP 失灵”的悬案,成为用户眼中的“系统神医”。

我小时候很黑的博客 593

简述OpenSessionInview的作用。

OpenSessionInViewFilter解决数据库操作表(一对多)延迟加载时session关闭的异常

jackeehai的博客 1562

大模型的实践应用31-基于通义千问大模型改进台风和海浪预测研究,利用机器学习与通义千问结合的思路实现对台风和海浪预测分析

通义千问大模型是阿里巴巴云推出的一款大规模语言模型,旨在通过强大的自然语言处理能力提供更广泛的服务。从最初的构想到如今的广泛应用,通义千问的发展见证了人工智能领域尤其是自然语言处理技术的巨大进步。自发布以来,通义千问不断迭代升级,不仅在规模上实现了飞跃式的增长,在性能方面也得到了显著提升。本次研究尝试将通义千问强大的自然语言处理能力与经典的时间序列预测算法相结合,旨在提高对未来天气状况预测的精度。具体来说,首先使用通义千问生成高质量的文字描述来增强特征表达力;

微学AI的博客 935

数据挖掘实战-基于随机森林算法的交通事故预测模型

本实验数据集来源于Kaggle,原始数据集共有209306条,该数据集包含不同地区和时间段的交通事故详细信息。它包括各种指标,例如事故日期、天气状况、照明条件、碰撞类型、受伤人数和车辆参与情况。数据涵盖多个地点和事故类型,可全面了解交通事故及其原因。具体包括:crash_date:事故发生的日期。Traffic_control_device:所涉及的交通控制设备的类型(例如交通灯、标志)。weather_condition:事故发生时的天气状况。

m0_64336780的博客 1万+

open session in view 理解

一、配置        在没有使用Spring提供的Open Session In View情况下,因需要在service(or Dao)层里把session关闭,所以lazy loading 为true的话,要在应用层内把关系集合都初始化,如 company.getEm

a154832918的专栏 5756

LangGraph教程8:LangGraph流式处理

流式处理可显著提升基于LLM应用的响应性。LangGraph支持两种流式模式:values模式返回每一步的完整结果,适合需要完整上下文处理的场景;updates模式仅返回增量变化,适用于实时更新需求。示例代码展示了如何用create_react_agent实现这两种模式,其中values模式完整记录处理流程,updates模式逐步输出结果。通过异步迭代输出流,开发者可以灵活选择适合应用场景的流式处理方式。

Cachel Wood的博客 620

关于OpenSessionInView 的作用、配置及原理

hibernate 允许对关联对象、属性进行延迟加载,但是必须保证延迟加载的操作限于同一个 Hibernate Session 范围之内进行。如果 Service 层返回一个启用了延迟加载功能的领域对象给 Web 层,当 Web 层访问到那些需要延迟加载的数据时,由于加载领域对象的 Hibernate Session 已经关闭,这些导致延迟加载数据的访问异常。把一个Hibernate Sessio...

Jae_Wang的博客 558

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

关于OpenSessionInView

当hibernate+spring配合使用的时候,如果设置了lazy=true,那么在读取数据的时候,当读取了父数据后,hibernate会自动关闭session,这样,当要使用子数据的时候,系统会抛出lazyinit的错误,这时就需要使用spring提供的 OpenSessionInViewFilter, OpenSessionInViewFilter主要是保持Session状态知道requ...

itcast123的专栏 120

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

聊聊spring data jpa的OpenSessionInView

为什么80%的码农都做不了架构师?>>> ...

weixin_34273479的博客 308

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

细谈Spring(十)OpenSessionInView详解及用法

首先我们来看一下什么是OpenSessionInView? 在hibernate中使用load方法时,并未把数据真正获取时就关闭了session,当我们真正想获取数据时会迫使load加载数据,而此时session已关闭,所以就会出现异常。比较典型的是在MVC模式中,我们在M层调用持久层获取数据时(持久层用的是load方法加载数据),当这一调用结束时,sessi...

weixin_34387284的博客 114

OpenSessionInViewFilter作用及配置

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34055910的博客 62

OpenSessionInViewFilter原理以及为什么要用OpenSessionInViewF

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34130269的博客 99

OpenSessionInViewFilter原理以及为什么要用OpenSessionInViewFilter

文章转载地址:http://hi.baidu.com/accpandsvse/blog/item/7e167783f271e8ab0cf4d297.html   OpenSessionInViewFilter原理以及为什么要用OpenSessionInViewFilter     struts2 里面OpenSessionInViewFilter 一定要写在最上

陈楚东的专栏-学编程切记心浮气躁,贵在坚持 741

Open Session In View解决session.close问题

在没有使用Spring提供的Open Session In View情况下,因需要在service(or Dao)层里把session关闭,所以lazy loading 为true的话,要在应用层内把关系集合都初始化,如 company.getEmployees(),否则Hibernate抛session already closed Exception;    Open Session In V...

分享经验 254

Write operations are not allowed in read-only mode

使用Spring提供的Open Session In View而引起Write operations are not allowed in read-only mode (FlushMode.NEVER) 错误解决:在没有使用Spring提供的Open Session In View情况下,因需要在service(or Dao)层里把session关闭,所以lazy loading 为true

sukyle的专栏 838

Open Session In View

无意中 在 http://yongzhao.iteye.com/blog/43592 看到了这篇文章,以前在论坛上提过类似的问题,特转贴过来,作为备份。 在没有使用Spring提供的Open Session In View情况下,因需要在service(or Dao)层里把session关闭,所以lazy loading 为true的话,要在应用层内把关系集合都初始化,如 company.g...

zhangzuanqian 90

Java程序员从笨鸟到菜鸟之(八十三)细谈Spring(十二)OpenSessionInView详解及用法...

首先我们来看一下什么是OpenSessionInView?  在hibernate中使用load方法时,并未把数据真正获取时就关闭了session,当我们真正想获取数据时会迫使load加载数据,而此时session已关闭,所以就会出现异常。比较典型的是在MVC模式中,我们在M层调用持久层获取数据时(持久层用的是load方法加载数据),当这一调用结束时,session随之关闭,...

www.v5qq.com的技术博客 278

Open Session In View模式的基本常识-zhuan

  OpenSessionInView 模式用法探讨     在没有使用Spring提供的Open Session In View情况下,因需要在service(or Dao)层里把session关闭,所以lazy loading 为true的话,要在应用层内把关系集合都初始化,如company.getEmployees(),否则Hibernate抛session already cl...

Jsky 328

使用Spring提供的Open Session In View而引起Write operations are not allowed in read-only mode (FlushMode.NEVE

1、在没有使用Spring提供的Open Session In View情况下,因需要在service(or Dao)层里把session关闭,所以lazy loading 为true的话,要在应用层内把关系集合都初始化,如 company.getEmployees(),否则Hibernate抛session already closed Exception; Open Session In V

漂流幻境 1256
上一篇: 注解(Annotation)基本概念
下一篇: ContextLoaderListener作用详解
broccoli2
博客等级 码龄10年 404粉丝 195原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值