`
summer_021
  • 浏览: 57955 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

(转) current_session_context_class的意思

 
阅读更多

此设置的作用如下:
What does sessionFactory.getCurrentSession() do? First, you can call it
as many times and anywhere you
like, once you get hold of your SessionFactory (easy thanks to
HibernateUtil). The getCurrentSession()
method always returns the "current" unit of work. Remember that we
switched the configuration option for this
mechanism to "thread" in hibernate.cfg.xml? Hence, the scope of the
current unit of work is the current Java
thread that executes our application. However, this is not the full
truth. A Session begins when it is first
needed, when the first call to getCurrentSession() is made. It is then
bound by Hibernate to the current
thread. When the transaction ends, either committed or rolled back,
Hibernate also unbinds the Session from
the thread and closes it for you. If you call getCurrentSession() again,
you get a new Session and can start a
new unit of work. This thread-bound programming model is the most
popular way of using Hibernate.

意思是说:

sessionFactory.getCurrentSession()可以完成一系列的工作,当调用时,
hibernate将session绑定到当前线程,事务结束后,hibernate
将session从当前线程中释放,并且关闭session。当再次调用getCurrentSession
()时,将得到一个新的session,并重新开始这一系列工作。
这样调用方法如下:

Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Event theEvent = new Event();
theEvent.setTitle(title);
theEvent.setDate(theDate);
session.save(theEvent);
session.getTransaction().commit();

不需要close session了。

 

前提是改值设置为了thread.

 

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 的方法。

分享到:
评论

相关推荐

    Hibernate_session_factory_配置.docx

    - `hibernate.current_session_context_class`:设置当前Session的上下文类,这里是`thread`,意味着每个线程都有一个独立的Session实例。 5. **连接池配置(C3P0)**: - `hibernate.c3p0.*`:C3P0是一个开源的...

    Hibernate源代码分析

    在 getCurrentSession() 方法中,SessionFactoryImpl 将获取 Session 的工作委托给了 currentSessionContext.currentSession(),currentSessionContext 是什么?它是 org.hibernate.context.CurrentSessionContext ...

    day36 11-Hibernate中的事务:当前线程中的session

    在Hibernate的配置中,可以通过`current_session_context_class`属性设置事务上下文。例如,将其设置为`thread`,表示使用ThreadLocal Session: ```xml &lt;property name="current_session_context_class"&gt;thread ``...

    spring MVC No Session found for current thread

    当我们遇到“Spring MVC No Session found for current thread”的错误时,这通常意味着在尝试访问HttpSession对象时,当前线程没有找到相关的session。这个问题可能是由于多种原因导致的,包括配置错误、过滤器设置...

    Hibernate的配置文件

    可以设置`current_session_context_class`属性来选择Session的上下文。例如: ```xml &lt;session-factory&gt; &lt;!-- Other properties --&gt; &lt;property name="current_session_context_class"&gt;thread &lt;/session-factory...

    hibernate关于session的关闭实例解析

    在 currentSession() 执行时,如果当前 Session 为空,currentSession 会调用 SessionFactory 的 openSession。 因此,getCurrentSession() 对于 Java EE 来说是更好的获取 Session 的方法。 Session 的关闭 在 ...

    HttpModule检验Session值

    在`Context_BeginRequest`事件处理程序中,我们可以访问`HttpContext.Current.Session`和`HttpContext.Current.Request.Cookies`来获取和检查Session和Cookie。如果Session为空或Cookie过期,我们可以采取相应的措施...

    spring 配置事务

    同时,为了使Hibernate的Session与Spring的事务生命周期同步,还需要在Hibernate的配置文件(如`hibernate.reveng.xml`)中启用`current_session_context_class`属性,设置为`org.springframework.orm.hibernate5....

    Hibernate源代码分析(一)

    return currentSessionContext.currentSession(); } 从上面的代码可以看到,getCurrentSession 方法将获得 Session 对象的工作委托给了 currentSessionContext 对象。currentSessionContext 对象是当前 Session 的...

    hibernate测试时遇到的几个异常及解决方法汇总

    &lt;property name="current_session_context_class"&gt;jta ``` 在不集成 Hibernate 的环境下(例如使用 JDBC 的独立应用程序),需要在 hibernate.cfg.xml 文件中添加: ``` &lt;property name="current_session_context_...

    hibernate_reference1.rar_配置文件

    - `&lt;property name="hibernate.current_session_context_class"&gt;`: 当前Session上下文,例如`thread`表示每个线程绑定一个Session。 5. **其他高级配置**: - `&lt;property name="hibernate.show_sql"&gt;`: 是否显示...

    Tomcat下配置Hibernate

    - `current_session_context_class`:设置当前线程中的Session实例,这里使用`thread`表示每个线程有一个独立的Session实例。 - `cache.provider_class`:设置缓存提供者类,默认不开启缓存。 ##### 4. 实体类...

    Hibernate核心配置文件对照表

    - `hibernate.current_session_context_class`: 当前Session上下文类,可以是`thread`(线程绑定)或`jta`(Java Transaction API)。 4. **日志配置** - `hibernate.show_sql`: 如果设置为`true`,Hibernate将在...

    Hibernate的课件以及一些配置的帮助

    8. **hibernate.current_session_context_class**:定义当前Session上下文的管理方式,例如ThreadLocal或JTA。 通过这些课件,学习者可以深入了解Hibernate的工作原理,如何配置其主要属性,以及如何根据项目的具体...

    Hibernate配置文件

    - `current_session_context_class`: 当前会话上下文类,比如`thread`表示线程绑定的会话。 5. **性能优化** - `hibernate.show_sql`: 是否在控制台打印执行的SQL语句,通常用于调试。 - `hibernate.format_sql`...

    维生药业小项目 SSH简单学习项目

    &lt;prop key="current_session_context_class"&gt;thread &lt;prop key="hibernate.show_sql"&gt;true &lt;prop key="hibernate.format_sql"&gt;true &lt;prop key="hibernate.hbm2ddl.auto"&gt;update ...

    hibernate 对事务并发处理

    &lt;property name="hibernate.current_session_context_class"&gt;thread ``` 然后,在程序中通过 sessionFactory.getCurrentSession() 获得线程绑定 Session 对象。 二级缓存 Hibernate 的二级缓存可以将数据库或者...

    HIBERNATE4开发文档,HIBERNATE4的变化

    同时,需要在Hibernate配置中指定`current_session_context_class`为`org.springframework.orm.hibernate4.SpringSessionContext`。 2. **缓存配置的改变** - Hibernate4中,缓存提供商由旧的类名改为`...

    Hibernate参数设置一览表

    12. **hibernate.current_session_context_class** 定义当前Session上下文的实现,如`thread`(默认,每个线程一个Session)或`managed`(在容器管理的事务中使用)。 13. **hibernate.id.new_generator_mappings*...

    hibernate配置文件

    - `current_session_context_class`: 定义当前Session的上下文,如`thread`(每个线程一个Session)或`managed`(容器管理的Session)。 5. **缓存配置** - `cache.region.factory_class`: 缓存提供商的全限定...

Global site tag (gtag.js) - Google Analytics