来源(转载):http://blog.csdn.net/woshisap/article/details/7024482

1:getCurrentSession会把Session和当前的线程关联起来,而openSession只是重新开启一个Session

2:getCurrentSession获得的Session会在事务关闭或者回滚时会自动关闭,而openSession获得的Session必须手动关闭

getCurrentSession,特定的实现用它来负责跟踪当前的上下文session,Hibernate内置了此接口的两种实现

* org.hibernate.context.JTASessionContext --当前session通过当前执行的线程来跟踪和界定

* org.hibernate.context.ThreadLocalSessionContext --当前线程通过当前执行的线程和跟踪和界定

这两种实现都提供了“每数据库事务对应一个session”的编程模型,也称作每次请求一个session,Hibernate session的起始和终结由数据库事务的生存来控制。

3:关于ThreadLocal的理解

线程局部变量,就是为每一个使用某变量的线程都提供一个该变量值的副本,是每一个线程都可以独立的改变自己的副本,而不会和其他线程的副本冲突,从线程的

角度看就好像每一个线程都完全拥有一个变量

实例代码:

  1. package com.capinfotech.ju.util;
  2. import org.hibernate.HibernateException;
  3. import org.hibernate.Session;
  4. import org.hibernate.SessionFactory;
  5. import org.hibernate.cfg.Configuration;
  6. public class HibernateUtil {
  7. public static final ThreadLocal sessionThreadLoacl = new ThreadLocal();
  8. public static final SessionFactory sessionFactory;
  9. static {
  10. try {
  11. sessionFactory = new Configuration().configure().buildSessionFactory();
  12. } catch(Throwable t) {
  13. throw new ExceptionInInitializerError(t);
  14. }
  15. }
  16. /**
  17. * 获取当前的Session
  18. * @return
  19. * @throws HibernateException
  20. */
  21. public static Session currentSession() throws HibernateException {
  22. Session session = (Session) sessionThreadLoacl.get();
  23. if(session == null) {
  24. session = sessionFactory.openSession();
  25. sessionThreadLoacl.set(session);
  26. }
  27. return session;
  28. }
  29. /**
  30. * 释放Session
  31. * @throws HibernateException
  32. */
  33. public static void closeSession() throws HibernateException {
  34. Session session = (Session)sessionThreadLoacl.get();
  35. if(session != null) {
  36. session.close();
  37. }
  38. sessionThreadLoacl.set(null);
  39. }
  40. }
package com.capinfotech.ju.util;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; public class HibernateUtil { public static final ThreadLocal sessionThreadLoacl = new ThreadLocal(); public static final SessionFactory sessionFactory; static {
try {
sessionFactory = new Configuration().configure().buildSessionFactory();
} catch(Throwable t) {
throw new ExceptionInInitializerError(t);
}
} /**
* 获取当前的Session
* @return
* @throws HibernateException
*/
public static Session currentSession() throws HibernateException {
Session session = (Session) sessionThreadLoacl.get();
if(session == null) {
session = sessionFactory.openSession();
sessionThreadLoacl.set(session);
}
return session;
} /**
* 释放Session
* @throws HibernateException
*/
public static void closeSession() throws HibernateException {
Session session = (Session)sessionThreadLoacl.get();
if(session != null) {
session.close();
} sessionThreadLoacl.set(null); }
}

在sessionFactory启动的时候,Hibernate会根据配置创建相应的CurrentSessionContext,在getCurrentSession()被调用的时候,实际被执行的方法是CurrentSessionContext.currentSession(),在currentSession()执行时,如果当前Session为空,currentSession会调用SessionFactory的openSession,

这样既保证了Session的线程安全,又不用每次数据库操作都重新获取一个Session实例,实现了Session重用

Hibernate关于openSession和getCurrentSession的理解的更多相关文章

  1. HIbernate中openSession和getCurrentSession

      这两者的差别网上非常多资源,我这里就copy一下了,然后有点问题的是今天遇到的问题.   openSession和getCurrentSession的根本差别在于有没有绑定当前线程,所以,用法有差 ...

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

    Hibernate openSession() 和 getCurrentSession的区别 getHiberanteTemplate .getCurrentSession和OpenSession 采 ...

  3. Hibernate中openSession() 与 getCurrentSession()的区别

    1 getCurrentSession创建的session会和绑定到当前线程,而openSession每次创建新的session. 2 getCurrentSession创建的线程会在事务回滚或事物提 ...

  4. Hibernate之openSession与getCurrentSession的区别

    openSession 与 getCurrentSession的区别(1)openSession 每一次获得的是一个全新的session对象,而getCurrentSession获得的是与当前线程绑定 ...

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

    1 getCurrentSession创建的session会和绑定到当前线程,而openSession不会. 2 getCurrentSession创建的线程会在事务回滚或事物提交后自动关闭,而ope ...

  6. openSession和getCurrentSession的比较

    在比较openSession和getCurrentSession这两个方法之前,我们先认识一下这两个方法. 在进行配置信息管理时,我们一般进行一下简单步骤: Configuration cfg = n ...

  7. sessionFactory中的openSession和getCurrentSession的一些注意事项

    今天进行Hibernate测试时遇到了一个问题 我在用sessionFactory生产seesion时出现了故障,使用getCurrentsesstion时产生异常: Exception in thr ...

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

    getCurrentSession创建的session会和绑定到当前线程,而openSession不会. getCurrentSession创建的线程会在事务回滚或事物提交后自动关闭,而openSes ...

  9. hibernate3.6-联合主键注解以及openSession和getCurrentSession区别

    [联合主键]>>>>配置方式:xml:    1. Student中单独创建StudentPk主键实体类 2. 配置: <composite-id name=" ...

随机推荐

  1. JPA EntityManagerFactory Vs Hibernate’s SessionFactory

    JPA使用EntityManagerFactory开闭session,而Hibernate使用SessionFactory开闭session.两者区别: 1. EntityManagerFactory ...

  2. 文本变语音引擎 ekho

    https://github.com/donaldlee2008/ekho https://www.oschina.net/p/ekho

  3. LINUX nfs服务

    1.什么是NFS(Network FileSystem)  NFS 就是 Network FileSystem 的缩写,最早之前是由 Sun 所发展出来的.他最大的功能就是可以透过网络,让不同的机器. ...

  4. 【Sort】Merge Sort归并排序

    归并排序运行时间O(N log N),但是由于需要线性附加内存,所以很少用于主存排序. 算法核心在于以下三条语句,分治递归,分别对左半边和右半边的数组进行排序,然后把左右半边的数组一一进行比较放入数组 ...

  5. ggplot2 geom设置—散点图

    散点图也是目前R中的常用的图形之一 geom_point(mapping = NULL, data = NULL, stat = "identity", position = &q ...

  6. jquery.cookie.js 的配置

    一个轻量级的cookie 插件,可以读取.写入.删除 cookie. jquery.cookie.js 的配置 首先包含jQuery的库文件,在后面包含 jquery.cookie.js 的库文件. ...

  7. LeetCode OJ 229. Majority Element II

    Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algorit ...

  8. 获取table表格的一些不为人知的属性

    JS获取表格的简便方法:获取tbody:tBodies   获取thead:tHead   获取tfoot:tFoot   获取行tr:rows   获取列td:cells 使用实例: oTable. ...

  9. digitalocean完成B轮8300万美元融资,赠送10美元优惠码

    7月8日,美国vps服务商digitalocean在官方博客宣传,公司完成高达8300万美元B轮融资.融资方包括 IA Ventures, Andreessen Horowitz和Access Ind ...

  10. mongodb安装 win7版

    首先下载mongdb的zip包,可以到:http://www.mongodb.org/downloads.选择32位或64位的. 在D盘创建mongodb文件夹,d:\mongodb.把解压里面所有的 ...