openSession() 与 getCurrentSession()

1 getCurrentSession创建的session会和绑定到当前线程,而openSession不会。

2 getCurrentSession创建的线程会在事务回滚或事物提交后自动关闭,而openSession必须手动关闭

 

 

这里getCurrentSession本地事务(本地事务:jdbc)时 要在配置文件里进行如下设置

    * 如果使用的是本地事务(jdbc事务)
 <property name="hibernate.current_session_context_class">thread</property>
 * 如果使用的是全局事务(jta事务)
 <property name="hibernate.current_session_context_class">jta</property> 

 

 getCurrentSession () 使用当前的session
openSession()         重新建立一个新的session

在一个应用程序中,如果DAO 层使用Spring 的hibernate 模板,通过Spring 来控制session 的生命周期,则首选getCurrentSession ()。

 

 

 

使用Hibernate的大多数应用程序需要某种形式的“上下文相关的” session,特定的session在整个特定的上下文范围内始终有效。然而,对不同类型的应用程序而言,要为什么是组成这种“上下文”下一个定义通常 是困难的;不同的上下文对“当前”这个概念定义了不同的范围。在3.0版本之前,使用Hibernate的程序要么采用自行编写的基于 ThreadLocal的上下文session,要么采用HibernateUtil这样的辅助类,要么采用第三方框架(比如Spring或Pico), 它们提供了基于代理(proxy)或者基于拦截器(interception)的上下文相关session。

从3.0.1版本开 始,Hibernate增加了SessionFactory.getCurrentSession()方法。一开始,它假定了采用JTA事务,JTA事务 定义了当前session的范围和上下文(scope and context)。Hibernate开发团队坚信,因为有好几个独立的JTA TransactionManager实现稳定可用,不论是否被部署到一个J2EE容器中,大多数(假若不是所有的)应用程序都应该采用JTA事务管理。 基于这一点,采用JTA的上下文相关session可以满足你一切需要。

更好的是,从3.1开 始,SessionFactory.getCurrentSession()的后台实现是可拔插的。因此,我们引入了新的扩展接口 (org.hibernate.context.CurrentSessionContext)和新的配置参数 (hibernate.current_session_context_class),以便对什么是“当前session”的范围和上下文(scope and context)的定义进行拔插。

请参阅 org.hibernate.context.CurrentSessionContext接口的Javadoc,那里有关于它的契约的详细讨论。它定义 了单一的方法,currentSession(),特定的实现用它来负责跟踪当前的上下文session。Hibernate内置了此接口的两种实现。

org.hibernate.context.JTASessionContext - 当前session根据JTA来跟踪和界定。这和以前的仅支持JTA的方法是完全一样的。详情请参阅Javadoc。

org.hibernate.context.ThreadLocalSessionContext - 当前session通过当前执行的线程来跟踪和界定。详情也请参阅Javadoc。

这 两种实现都提供了“每数据库事务对应一个session”的编程模型,也称作每次请求一个session。Hibernate session的起始和终结由数据库事务的生存来控制。假若你采用自行编写代码来管理事务(比如,在纯粹的J2SE,或者 JTA/UserTransaction/BMT),建议你使用Hibernate Transaction API来把底层事务实现从你的代码中隐藏掉。如果你在支持CMT的EJB容器中执行,事务边界是声明式定义的,你不需要在代码中进行任何事务或 session管理操作。请参阅第 11 章 事务和并发一节来阅读更多的内容和示例代码。

hibernate.current_session_context_class 配置参数定义了应该采用哪个org.hibernate.context.CurrentSessionContext实现。注意,为了向下兼容,如果未 配置此参数,但是存在org.hibernate.transaction.TransactionManagerLookup的配 置,Hibernate会采用org.hibernate.context.JTASessionContext。一般而言,此参数的值指明了要使用的实 现类的全名,但那两个内置的实现可以使用简写,即"jta"和"thread"。

1、getCurrentSession()与openSession()的区别?

* 采用getCurrentSession()创建的session会绑定到当前线程中,而采用openSession()
创建的session则不会
* 采用getCurrentSession()创建的session在commit或rollback时会自动关闭,而采用openSession()
创建的session必须手动关闭
2、使用getCurrentSession()需要在hibernate.cfg.xml文件中加入如下配置:
* 如果使用的是本地事务(jdbc事务)
<property name="hibernate.current_session_context_class">thread</property>
* 如果使用的是全局事务(jta事务)

<property name="hibernate.current_session_context_class">jta</property>

利于ThreadLocal模式管理Session
   早在Java1.2推出之时,Java平台中就引入了一个新的支持:java.lang.ThreadLocal,给我们在编写多线程程序
   时提供了一种新的选择。ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,
   而是thread local variable(线程局部变量)。也许把它命名为ThreadLocalVar更加合适。线程局部变量(ThreadLocal)
   其实的功用非常简单,就是为每一个使用某变量的线程都提供一个该变量值的副本,是每一个线程都可以独立地改变自己的副本,
   而不会和其它线程的副本冲突。从线程的角度看,就好像每一个线程都完全拥有一个该变量。
   ThreadLocal是如何做到为每一个线程维护变量的副本的呢?其实实现的思路很简单,在ThreadLocal类中有一个Map,
   用于存储每一个线程的变量的副本。比如下面的示例实现(为了简单,没有考虑集合的泛型):
public class HibernateUtil {

public static final ThreadLocal session =new ThreadLocal();

public static final SessionFactory sessionFactory;
   static {
      try {
        sessionFactory = new Configuration().configure().buildSessionFactory();
      } catch (Throwable ex) {
           throw new ExceptionInInitializerError(ex);
      }    
}

     public static Session currentSession () throws HibernateException {
        Session s = session.get ();
        if(s == null) {
          s = sessionFactory.openSession ();
          session.set(s);
           }
         return s;
       }

    public static void closeSession() throws HibernateException {
           Session s = session.get ();
        if(s != null) {
            s.close();
        }
        session.set(null);
    }
}

 

 

openSession() 与 getCurrentSession() 有何不同和关联呢?

 

在 SessionFactory 启动的时候, Hibernate 会根据配置创建相应的 CurrentSessionContext ,在 getCurrentSession() 被调用的时候,实际被执行的方法是 CurrentSessionContext.currentSession() 。在 currentSession() 执行时,如果当前 Session 为空, currentSession 会调用 SessionFactory 的 openSession 。所以 getCurrentSession() 对于 Java EE 来说是更好的获取 Session 的方法。

IEM模型,地表粗糙度模拟 利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟 立即下载

相关推荐

FANUC机器人电弧跟踪功能深度解析:从电流采样原理到ROBOGUIDE仿真避坑指南

本文深度解析FANUC机器人电弧跟踪技术,从电流采样原理到ROBOGUIDE仿真避坑指南,详细介绍了电流波形分析、实时补偿机制及现场调试技巧。针对工业焊接中的常见问题,提供从底层原理到高阶应用的解决方案,帮助工程师优化自动化焊接质量。

weixin_31785177的博客 553

openSession()方法参数、Mybatis存储过程、类型处理器、多数据库环境配置

1、openSession方法参数 可以看官方文档:https://mybatis.org/mybatis-3/zh/java-api.html#sqlSessions 1、事务处理: 你希望在 session 作用域中使用事务作用域,还是使用自动提交(auto-commit)? 当boolean默认为false false事务处理方式,关闭自动提交 ⭐ true,主动提交,在增删改的时候不要在commit 2、 数据库连

weixin_44051048的博客 6572

MySQL等保三级合规实践:如何安全配置root账户的本地与受信主机登录策略

本文详细介绍了MySQL在等保三级合规框架下如何安全配置root账户的本地与受信主机登录策略。通过分析root账户的特殊保护需求,提供三种安全加固方案,包括限制访问范围、限定登录IP和完全禁止远程登录,并指导创建安全的远程管理账户。文章还涵盖了密码策略强化、日志审计配置和网络层防护等关键合规要求,帮助用户实现MySQL的等保三级全面合规。

weixin_42522964的博客 260

【python】Flask之session使用

一、session机制 1.1 session的作用 由于http协议是一个无状态的协议,但网站基本上有登录使用的功能,这要求有状态管理,而session机制实现的就是这个功能 session基于cookie实现, 保存在服务端的键值对(形式:{随机字符串:'xxxxxx'}), 同时在浏览器中的cookie中也对应一相同的随机字符串,用来再次请求的时候验证 1.2 实现的原理 用户第一次请求后,将产生的状态信息保存在session中,可以把session当做一个容器,保存了正在使用的所有用户的状态信息,这

sysu_lluozh 8380

ComfyUI新手必看:JoyCaption 2插件安装全流程(附百度网盘资源)

本文为ComfyUI新手提供了JoyCaption 2插件的完整安装与部署指南。详细介绍了从环境准备、插件获取、模型文件配置到核心节点使用的全流程,并重点解析了其集成的LLM反推模式,帮助用户高效实现从图片到精准提示词的转换。

mango的博客 306

差分信号_差分信号的原理及其在PCB的设计

差分线是 PCB 设计中非常重要的一部分信号线,信号处理要求也是相当严谨,今天为大家介绍下差分信号的原理以及其在 PCB 设计中的处理方法。 什么是差分信号 差分传输是一种信号传输的技术,区别于传统的一根信号线一根地线的做法,差分传输在这两根线上都传输信号,这两个信号的振幅相等,相位相差 180 度,极性相反。在这两根线上传输的信号就是差分...

weixin_31849185的博客 1812

getCurrentSession 与 openSession() 的区别 getCurrentSession 与 openSession() 的区别

<br />1 getCurrentSession创建的session会和绑定到当前线程,而openSession不会。<br />2 getCurrentSession创建的线程会在事务回滚或事物提交后自动关闭,而openSession必须手动关闭<br />这里getCurrentSession本地事务(本地事务:jdbc)时 要在配置文件里进行如下设置<br />    * 如果使用的是本地事务(jdbc事务)<br />  <property name="hibernate.current_ses

光辉岁月 509

从零构建锂电池主动均衡系统:Simulink仿真中的Buck-Boost拓扑实战指南

本文详细介绍了如何在Simulink中从零构建基于Buck-Boost拓扑的锂电池主动均衡系统。通过仿真环境搭建、参数优化、控制策略设计和性能评估,为工程师提供了完整的实战指南,帮助快速验证和优化均衡算法,提升电池组一致性与寿命。

gitlab7runner的博客 898

5-flask-session源码(save_session和open_session)、flask闪现、 flask请求扩展

flask-session源码(save_session和open_session)、flask闪现、 flask请求扩展

linjun的博客 293

CCS20实战入门:第一个工程搭建示例

通过实际操作演示如何在ccs20中创建并配置首个开发项目,涵盖环境设置与基础调试步骤,帮助新手快速上手ccs20集成开发环境,提升嵌入式开发效率。

weixin_31185473的博客 888

UG二次开发GRIP刻字

UG二次开发GRIP刻字

qq285503851的博客 1138

SqlSession中的OpenSession到底做了什么?

从环境中获取事务的工厂,返回一个environment对象获取事务工厂 事务工厂创建事务 通过configuration拿到一个执行器传入事务(Transaction)和类型(execType(枚举)) 最后返回一个DefaultSqlSession openSession底层就是做各种成员变量的初始化 例如:configuration,executor,dirty(内存当中的数据与数据

qq_36074042的博客 5852

利用baostock获取上市公司财务指标

利用baostock获取上市公司的财务指标 1、导入模块,登录baostock import baostock as bs import pandas as pd import time # 登陆系统 lg = bs.login() # 显示登陆返回信息 print('login respond error_code:'+lg.error_code) print('login respond error_msg:'+lg.error_msg) 2、查询股票代码、行业板块 # 查询股票代码 rs=.

firefox_yau的博客 2100

Hibernate中openSession()和getCurrentSession()方法的区别

首先它们都是通过SessionFactory构建Session对象的。 一、区别: 1. openSession 从字面上可以看得出来,是打开一个新的session对象,而且每次使用都是打开一个新的session,假如连续使用多次,则获得的session不是同一个对象,并且使用完需要调用close方法关闭session。 2. getCurrentSession ,从字面上可以看得出来,是获...

“花花”公子_龙的博客 3927

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

hibernate 的SessionFactory的getCurrentSession 与 openSession() 的区别

1 getCurrentSession创建的session会和绑定到当前线程,而openSession不会。2 getCurrentSession创建的线程会在事务回滚或事物提交后自动关闭,而openSession必须手动关闭这里getCurrentSession本地事务(本地事务:jdbc)时 要在配置文件里进行如下设置* 如果使用的是本地事务(jdbc事务) thread * 如果使用的是全局

qq_17284367的专栏 554

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

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

Hibernate getCurrentSession() VS openSession()

public String dynamicSouce(){ DynamicDataSource.setCustomerType(DynamicDataSource.DATA_SOURCE_2); Session session = sessionFactory.openSession(); //Session session = sessionFactory.getCurrentSes

crystalplane8的专栏 653

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

getCurrentSession()与openSession()的区别?

1、getCurrentSession()与openSession()的区别? 采用getCurrentSession()创建的session会绑定到当前线程中,而采用openSession(),创建的session则不会 采用getCurrentSession()创建的session在commit或rollback时会自动关闭,而采用openSession(),创建的session必须手动关闭...

梁同学与Android 265

getCurrentSession 与 openSession() 的区别

 1 getCurrentSession创建的session会和绑定到当前线程,而openSession不会。2 getCurrentSession创建的线程会在事务回滚或事物提交后自动关闭,而openSession必须手动关闭  这里getCurrentSession本地事务(本地事务:jdbc)时 要在配置文件里进行如下设置    * 如果使用的是本地事务(jdbc事务

LoveYouT的专栏 5万+

Hibernate 中 openSession()和getCurrentSession() 的区别

getCurrentSession () 使用当前的session       openSession()重新建立一个新的session 在一个应用程序中,如果DAO 层使用Spring 的hibernate 模板,通过Spring 来控制session 的生命周期,则首选getCurrentSession () 1. 如果使用的是getCurrentSession来创

小人物的专栏 818

getCurrentSession()与openSession()的区别

采用getCurrentSession()创建的session会绑定到当前线程中,而采用openSession()创建的session则不会 采用getCurrentSession()创建的session在commit或rollback时会自动关闭,而采用openSession()创建的session必须手动关闭 使用getCurrentSession(

七两雨 534

hibernate中openSession()跟getCurrentSession()方法之间的区别

Hibernate openSession() 和 getCurrentSession的区别   getHiberanteTemplate 、getCurrentSession和OpenSession  采用getCurrentSession()创建的Session会绑定到当前的线程中去、而采用OpenSession()则不会。 采用getCurrentSession()创建的Session...

qq_24815873的博客 485

Hibernate——openSession()与getCurrentSession()的区别

openSession(): ·永远打开新的Session ·需要手写session.close()getCurrentSession(): ·若当前环境(上下文)中有Session(即Session没commit之前),则会取当前上下文中的Session,否则创建一个新的Session 用途:界定事务边界 ·事务提交自动执行close()上下文: 在hibernate.

菜鸟的成长之路... 353

Hibernate openSession() 和 getCurrentSession的区别

Hibernate openSession() 和 getCurrentSession的区别   getHiberanteTemplate 、getCurrentSession和OpenSession  采用getCurrentSession()创建的Session会绑定到当前的线程中去、而采用OpenSession()则不会。 采用getCurrentSession()创建的

CmdSmith的博客 493

Hibernate 中getCurrentSession 与 openSession() 的区别

1、getCurrentSession()与openSession()的区别? * 采用getCurrentSession()创建的session会绑定到当前线程中,而采用openSession() 创建的session则不会 * 采用getCurrentSession()创建的session在commit或rollback时会自动关闭,而采用openSession() 创建的sessio

笑看人生的专栏 1351
上一篇: 开源网站收藏
下一篇: 属性文件的读写
programloverjack
博客等级 码龄17年 5粉丝 252原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值