用spring控制hibernate的session何时关闭

C# 【WebService编写调用】 😹 觉得博主文章写的不错的话,希望大家三连(✌关注,✌点赞,✌评论),多多支持一下!!! 阅读详情

用spring控制hibernate的session何时关闭



在用spring管理hierbernate的事务我们一般都用TransactionProxyFactoryBean去配置我们的Service方法.

如.

<bean id="baseTxProxy" lazy-init="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true">
         <property name="transactionManager"><ref bean="transactionManager"/></property>
         <property name="transactionAttributes">
             <props>
     <prop key="*">PROPAGATION_REQUIRED</prop>
     <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>  
     <prop key="is*">PROPAGATION_REQUIRED,readOnly</prop>         
     <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>     
             </props>
         </property>
     </bean>

<!-- <bean id="userManager" parent="baseTxProxy">
         <property name="target">
             <bean class="com.javaeye.user.impl.hibernate.UserManagerImpl" autowire="byName">
                 <property name="cacheQueries"><value>true</value></property>
             </bean>
         </property>
     </bean>
-->       

<bean id="userService" parent="baseTxProxy">
   <property name="target">
    <bean class="com.dengyin.report.service.impl.UserServiceImpl" autowire="byName"/>
   </property>
</bean>

<bean id="dailyReportService" parent="baseTxProxy">
   <property name="target">
    <bean class="com.dengyin.report.service.impl.DailyReportServiceImpl" autowire="byName"/>
   </property>
</bean>

我们可以想得到TransactionProxyFactoryBean是使用aop在Service方法之前open 一个session, begin Trans.在Service结束之后Commit Trans, close session.

但是我们使用spring的OpenSessionInViewFilter的时候就不能在Service方法后close session了. 应该是在Render page之后再关闭session的.所以我跟踪了spring的代码. 最后发现了spring是怎样做的(跟了好久,主要是上班偷偷摸摸搞的).

    HibernateTransactionObject txObject = (HibernateTransactionObject) transaction;
    if (txObject.getSessionHolder() == null) {
     Interceptor entityInterceptor = getEntityInterceptor();
     Session newSession = (entityInterceptor != null ?
       getSessionFactory().openSession(entityInterceptor) : getSessionFactory().openSession());
     if (logger.isDebugEnabled()) {
      logger.debug("Opened new Session [" + newSession + "] for Hibernate transaction");
     }
     txObject.setSessionHolder(new SessionHolder(newSession), true);
    }

    txObject.getSessionHolder().setSynchronizedWithTransaction(true);
    session = txObject.getSessionHolder().getSession();

这段代码是在进行Service之前的. 如果当前thread没有session的话就执行txObject.setSessionHolder(new SessionHolder(newSession), true);注意这里set了一个true值. 我们来看看txObject是一个什么东西.

private static class HibernateTransactionObject extends JdbcTransactionObjectSupport {

   private SessionHolder sessionHolder;

   private boolean newSessionHolder;

   public void setSessionHolder(SessionHolder sessionHolder, boolean newSessionHolder) {
    this.sessionHolder = sessionHolder;
    this.newSessionHolder = newSessionHolder;
   }

   public SessionHolder getSessionHolder() {
    return sessionHolder;
   }

   public boolean isNewSessionHolder() {
    return newSessionHolder;
   }

   public boolean hasTransaction() {
    return (this.sessionHolder != null && this.sessionHolder.getTransaction() != null);
   }

   public void setRollbackOnly() {
    getSessionHolder().setRollbackOnly();
    if (getConnectionHolder() != null) {
     getConnectionHolder().setRollbackOnly();
    }
   }

   public boolean isRollbackOnly() {
    return getSessionHolder().isRollbackOnly() ||
      (getConnectionHolder() != null && getConnectionHolder().isRollbackOnly());
   }
}

我们看看Service方法之后spring怎样close session的.

   Session session = txObject.getSessionHolder().getSession();
   if (txObject.isNewSessionHolder()) {
    if (logger.isDebugEnabled()) {
     logger.debug("Closing Hibernate Session [" + session + "] after transaction");
    }
    SessionFactoryUtils.releaseSession(session, getSessionFactory());
   }
   else {
    if (logger.isDebugEnabled()) {
     logger.debug("Not closing pre-bound Hibernate Session [" + session + "] after transaction");
    }
    if (txObject.getSessionHolder().getPreviousFlushMode() != null) {
     session.setFlushMode(txObject.getSessionHolder().getPreviousFlushMode());
    }
   }
   txObject.getSessionHolder().clear();

当txObject.isNewSessionHolder()的时候才会close   session.

总结:

所以当Service方法之间没有存在的session时spring会开一session,然后结束的时候close session.

当Service方法之间有存在的session的话,Service方法结束时并没有关闭   session.






转自:http://hi.baidu.com/injava/blog/item/e3778723d2218a46ac34defb.html



棋牌App逆向工程实战:透视风险分析与反作弊加固思路 在移动应用安全领域,逆向工程是一项关键的攻防技术,它通过静态分析、动态调试与协议抓包等手段,深入还原客户端真实逻辑。这项技术的核心原理,是从已编译的安装包中提取数据流,验证服务端下发的信息是否超出了客户端应有的可见范围。从技术价值看,安全测试人员可以借此定位协议层、内存层与缓存层的潜在风险,为反作弊体系提供精准的加固建议。在棋牌类App等实时对局场景中,逆向工程常被用于排查牌局信息泄露类隐患,而合规授权与测试环境是开展此类研究的必要前提。本文结合一次棋牌App的安全评估实践,梳理了从环境准备到数据流还原的完 阅读详情

相关推荐

SystemVerilog实战:AXI Stream协议从零搭建(附完整代码解析)

本文详细介绍了如何使用SystemVerilog从零搭建AXI Stream协议,包括核心信号解析、接口设计、主从设备实现及验证环境构建。通过完整的代码示例和工程实践技巧,帮助开发者掌握AXI Stream在FPGA/ASIC设计中的高效数据传输方法,特别适合视频处理和网络数据传输等应用场景。

weixin_29207439的博客 360

Hibernate 关闭sessionFactory

关闭sessionFactory是应在服务器被关闭,程序被卸载时关闭,所以需要写一个sessionFactory特有的监听类,当服务器被关闭时,自动关闭sessionFactory. 写个监听类 实现ServletContextListener 在该类中关闭关闭sessionFactory ,以下就是: package cn.com.csuinfosoft.listener; im

mzglzzc的专栏 3241

红外弱小目标检测:IPI算法解读及MATLAB复现

参考文献:[1]C. Gaoet al., “Infrared Patch-Image Model for Small Target Detection in a Single Image,” vol. 22, no. 12, pp. 4996–5009, 2013. 本文整理????论文笔记,并附MATLAB实现代码。 一、阅读笔记 1. 摘要 IPI算法是单帧检测算法; 利用背景的非局部子相关性(non-local self-correlation ofbackground),将目标检测转..

小草莓的魔法笔记 1万+

hibernate的对象状态和opensessioninviewfilter的作用

hibernate的对象状态分为三种: 瞬时状态(未持久化,新new的对象),持久状态(在数据库中有值的对象,具体是怎么操作的?是通过主键id来关联判断的吗?),游离状态(db中不存在,已经被删除,但是在程序中还保持该引用的对象); 对于持久化对象,在session清理缓存即flush方法的时候会做检查,检查对象中的属性是否发生变化,如果发生了变化(比如set了一些值),那么就会和数据库做同步

SkydivingWang的博客 677

OpenClaw 3.13 + Mac mini M4 集成 qmd 记忆存储:qmd embed 卡死 / 报错 sqlite-vec 不可用 终极解决教程

模型加速让 qmd 从国内镜像下载模型,避免网络超时;SQLite 扩展支持:修改 qmd 源码后,Bun 不再使用内置 SQLite,而是调用 Homebrew 安装的,该版本支持接口,可正常加载vec0.dylib向量扩展;OpenClaw 3.13 适配:核心逻辑与 OpenClaw 3.13 的 qmd 记忆调用逻辑完全兼容,无需额外调整;sqlite-vec 加载:qmd 自动通过sqlite-vec包获取vec0.dylib路径,调用完成向量扩展加载,实现高效向量搜索。

wuanxionglidui的博客 1305

第三节: 串口通信(用CubeMX学习STM32)

用CubeMX学习STM32, 串口通信学习, 通过轮询方式和中断方式两种方式进行通信演示。 STM32F407zgt6

Kevin_8_Lee的博客 8904

解决Hibernate的Session的关闭与开启问题

当在使用Hibernate做开发的时候出现org.hibernate.LazyInitializationException: could not initialize proxy - no Session 错误提示 病症:这是一个lazy使用后的Exception,使用迟时加载,在session(hibernate里的session)关闭后使用该对象的未加载变量,也就是说session已经关

请叫我 2万+

GPU硬件架构与微架构深度解析34-GPU安全架构深度解析

现代GPU不仅是图形处理器,更是高性能计算平台,安全架构设计至关重要。内存加密- 保护数据在传输和存储时的安全安全启动- 确保固件和软件的完整性隔离机制- 防止不同应用间的数据泄露密钥管理- 安全存储和处理加密密钥。

2301_79143213的博客 101

spring 控制hibernate的session何时关闭.

在用spring管理hierbernate的事务我们一般都用TransactionProxyFactoryBean去配置我们的Service方法.如.                                 PROPAGATION_REQUIRED    PROPAGATION_REQUIRED,readOnly      PROPAGATION_REQUIRED,readOnly    

dengyin2000的专栏 1万+

基于深度学习的三维重建算法——详解与实现

随着深度学习技术的迅猛发展,基于深度学习的三维重建算法在最近几年取得了显著的进展。而基于深度学习的三维重建算法通过利用深度神经网络,能够从大规模数据中学习到更准确、鲁棒的三维结构表示。本文综述了基于深度学习的三维重建算法,并给出了相应的源代码。随着深度学习技术的不断发展,我们相信基于深度学习的三维重建算法将会在未来得到更广泛的应用。实验结果表明,基于深度学习的三维重建算法在准确性和鲁棒性方面取得了显著的提升。以上是关于基于深度学习的三维重建算法的详细介绍与实现,希望对您有所帮助。

CyberGenius的博客 1230

OpenClaw第2章:快速安装

本章将手把手教你安装 OpenClaw。

Maynor的博客 3237

Spring 中Hibernate session 打开和关闭总结

session的断开是在org.springframework.orm.hibernate.SessionFactoryUtils中处理的。  如果应用程序使用了OpenSessionInViewFilter或者OpenSessionInViewInterceptor,那么所有的打开过的session会注册在ThreadLocal里。在当前线程退出前,OpenSessionInViewFilte

mafly008的专栏 9466

Jetson AGX Orin平台Jetpack5升级Jetpack6,自研载板USB不工作问题调试

1. 问题描述将AGX Orin工业的新板放到定制的载板上当在ubuntu 22和Jetpack 6.1上使用SDKManager刷机时,lsusb为空,并且在引导时没有发现/注册xusb设备。USB C端口正常打开并供电,但似乎没有数据传输。在Ubuntu 18 Jetpack 5.1.4 SDKManager上同样刷机之后,usb C集线器在引导时被正确地发现,显示在lsusb中,并识别/挂载外部驱动器。

jzwjzw19900922的博客 1510

Hibernate session关闭策略

Hibernate中session是使用最频繁的对象,我们需要对session进行有效管理,即在执行数据库操作前打开session,在执行操作后关闭session。 对session的管理有两种场景: 1) 没有和Spring集成,我们自己管理 我们调用Hibernate的sessionFactory.openSession()方法,...

bto310 443

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Spring与Hibernate集成中的session问题

1.通过getSession()方法获得session进行操作 Java代码 public class Test  extends HibernateDaoSupport{        public void save(User user){           this.getSession().save(user);        }   }     利用这种方式获得的s...

正走向大牛的菜鸟 199

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Spring对Hibernate的Session和SessionFactory的管理(转帖)

spring+hibernate里session的管理 在spring+hibernate的时候,控制台提示“unclosed connection,forgot to call close() on your session?”或者是[org.hibernate.jdbc.ConnectionManager] - 那是因为有可能是你自己手动创建了session,比如:private stat

Oneil_Sally的专栏 1412

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Spring中的Hibernate Session

原文地址:http://www.iteye.com/topic/733971 只是方便以后查询,摘抄过来,请支持原文作者。 1.通过getSession()方法获得session进行操作 public class Te...

开心就好! 142

spring整合hibernate关于session的管理

系统重构,使用了Hibernate的泛型 DAO后,发现连接几次数据库后,tomcat 就完全没反应了,后台也没报错。怀疑是数据库连接耗尽。我在spring的applicationContext.xml中配置了maxPoolSize值是80,自己写了个测试程序,果然连接80次后再也没法连接了。 原来是在dao层通过 super.getSession() 后,该session并不会主动由sprin

大数据的天空 471

spring+hibernate里session的管理

在spring+hibernate的时候,控制台提示“unclosed connection,forgot to call close() on your session?”或者是[org.hibernate.jdbc.ConnectionManager] - 那是因为有可能是你自己手动创建了session,比如:private static final SessionFactory sess

thinker28754的专栏 1136
上一篇: Spring与Hibernate的整合与解耦
下一篇: Spring管理 hibernate 事务配置的五种方式
zljjava
博客等级 码龄15年 155粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值