getCurrentSession与openSession的区别

简介:
 

1. 如果使用的是getCurrentSession来创建session的话,在commit后,session就自动被关闭了,也就是不用再session.close()了。但是如果使用的是openSession方法创建的session的话,那么必须显示的关闭session,也就是调用session.close()方法。这样commit后,session并没有关闭
 

2. getCurrentSession的使用可以参见hibernate\hibernate-3.2\doc\tutorial\src项目

3. 使用SessionFactory.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);
    }
 }

 

原帖地址:http://blog.sina.com.cn/s/blog_606b1aab0100diaa.html

目录
相关文章
|
存储 Kubernetes Linux
helm 简介及基本使用
helm 简介及基本使用
3369 0
helm 简介及基本使用
|
机器学习/深度学习 存储 Shell
分享使用谷歌Colab 常用小tips, 玩转Google Colab
分享使用谷歌Colab 常用小tips, 玩转Google Colab
分享使用谷歌Colab 常用小tips, 玩转Google Colab
|
7月前
|
人工智能 自然语言处理 Linux
OSUM:告别ASR单一功能,西工大开源的语音大模型会「读心」!识别+情感分析+年龄预测等8大任务1个模型全搞定
OSUM 是西北工业大学开发的开源语音理解模型,支持语音识别、情感分析、说话者性别分类等多种任务,基于 ASR+X 训练策略,具有高效和泛化能力强的特点。
556 8
OSUM:告别ASR单一功能,西工大开源的语音大模型会「读心」!识别+情感分析+年龄预测等8大任务1个模型全搞定
|
Shell 开发工具 git
【Git】解决Untracked Files Prevent Checkout的问题
【Git】解决Untracked Files Prevent Checkout的问题
3461 0
|
10月前
|
SQL 存储 关系型数据库
多态性在面向对象编程中的应用场景
多态性是面向对象编程的核心特性之一,允许使用同一接口表示不同类型的对象,提高代码的灵活性和可扩展性。常见应用场景包括:方法重写、接口实现、抽象类等,通过多态可以轻松管理复杂系统,实现软件组件的松耦合。
342 5
|
11月前
|
存储 Java 数据库连接
@OneToOne注解的作用
@OneToOne注解的作用
|
SQL Java 数据库连接
Hibernate 批量操作来袭!掌握最佳实践,轻松应对数据洪流,开启高效开发新时代
【9月更文挑战第3天】在软件开发中,高效数据操作至关重要。作为流行的Java持久化框架,Hibernate提供了强大的数据库操作功能。本文探讨了Hibernate批量操作,包括批量插入、更新和删除的最佳实践,通过使用原生SQL和`Session`的`createNativeQuery()`方法,结合`addBatch()`及`executeBatch()`方法实现高效批量操作。合理设置批量大小、事务管理和性能测试是优化的关键。在实际开发中,应根据业务需求和性能要求选择合适的方法,以提升程序性能和可维护性。
635 3
|
Java 数据库连接 数据库
MybatisPlus中IService接口有什么用?
MybatisPlus中IService接口有什么用?
311 0
|
监控 Java 数据库
java线上服务问题排查总结
java线上服务问题排查 1、业务日志相关 如果应用系统出现异常,一般都会在业务日志中体现 查看日志问题常用命令,以标装springboot应用为例: 进到标装日志目录:cd /wls/applogs/rtlog/spri* --善用tab键 统计当天业务日志中ERROR出现数量:egre.
47460 0
|
缓存 Android开发 Python
告别卡顿困扰:IDEA 性能优化设置
在我们日常使用IDEA进行开发时,可能会遇到许多卡顿的瞬间,明明我们的机器配置也不低啊?为什么就会一直卡顿呢? 原来这是因为IDEA软件在我们安装的时候就设置了默认的内存使用上限(通常很小),这就是造成我们使用IDEA时卡顿的根本原因。
告别卡顿困扰:IDEA 性能优化设置