`

Hibernate中的ThreadLocal类

阅读更多
我们知道,Session是Hibernate运行的核心,通过它来对对象的生命周期,事务的管理和数据库的存取进行管理。
首先我们来看一下threadLocal类。
我们从上一篇文章已经知道,SessionFactory是线程安全的,不同的线程对它的实例进行调用,不会发生数据共享方面的问题。而 Session是又SessionFactory创建的,它却不是线程安全的,我们不能让session来进行数据共享。为了解决这个问题我们引入了 ThreadLocal类。下面看一下代码:
Java代码

   1. package com.jnotnull; 
   2. import org.hibernate.*; 
   3. import org.hibernate.cfg.*; 
   4. public class SessionTest{ 
   5. private static final SessionFactory sessionFactory; 
   6. static{ 
   7. try{ 
   8. sessionFactory = new Configuration().configure().buildSessionFactory(); 
   9. }catch(Exception e){  
  10. } 
  11.  
  12. public static final ThreadLocal threadlocal = new ThreadLocal(); 
  13. public static Session currentSession(){ 
  14. Session s = (Session)threadlocal.get(); 
  15. if(s==null){ 
  16. s=sessionFactory.openSession(); 
  17. threadlocal.set(s); 
  18. } 
  19. return s; 
  20. } 
  21. } 
  22.  
  23. public static void closeSession(){ 
  24. Session s =(Session)threadlocal.get(); 
  25. if(s != null) 
  26.  s.close(); 
  27. threadlocal.set(null); 
  28. } 
  29.  
  30. } 

package com.jnotnull;
import org.hibernate.*;
import org.hibernate.cfg.*;
public class SessionTest{
private static final SessionFactory sessionFactory;
static{
try{
sessionFactory = new Configuration().configure().buildSessionFactory();
}catch(Exception e){
}

public static final ThreadLocal threadlocal = new ThreadLocal();
public static Session currentSession(){
Session s = (Session)threadlocal.get();
if(s==null){
s=sessionFactory.openSession();
threadlocal.set(s);
}
return s;
}
}

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

}



这里我们可以看到运用 ThreadLocal,可以在每一个线程中创建一个单独的Session,这样就保证了线程的安全了。
这里还要注意的是,这里的Session是保留着对各种操作的结果,和http中的session是不同的。
分享到:
评论

相关推荐

    Hibernate用ThreadLocal模式(线程局部变量模式)管理Session

    1. 在ThreadLocal类中,有一个内部的Map,用于存储每个线程的变量副本。这个Map的键是Thread对象,值是ThreadLocal变量的副本。 2. 当调用ThreadLocal.get()时,它会找到当前线程对象,并从Map中查找对应的值。如果...

    JAVA ThreadLocal类深入

    在这个例子中,getSession()方法会检查ThreadLocal中是否存在Session,若不存在则创建并设置,而closeSession()方法则负责关闭并移除当前线程的Session副本。 总结来说,ThreadLocal是Java中解决多线程数据隔离问题...

    hibernate中session的管理

    在`TestServlet`的例子中,我们创建一个ThreadLocal类型的`localSession`变量,然后在`doGet`方法中将从SessionFactory获取的Session保存到ThreadLocal中。在`doSomething`方法中,我们通过ThreadLocal的`get`方法...

    入研究java.lang.ThreadLocal类.docx

    - **实现原理**:通过在 ThreadLocal 类中维护一个 Map 结构来存储每个线程的变量副本。 **应用场景**: - 在多线程环境中,避免共享资源竞争,如数据库连接、Session 等。 - 避免使用 synchronized 同步机制带来的...

    ThreadLocal的几种误区

    因此,开发者在使用ThreadLocal时必须小心,避免在ThreadLocal中存储长期有效的数据,防止其他线程意外访问。 误区四:ThreadLocal可以随意多用 ThreadLocal虽然能提供方便的线程隔离,但过度依赖ThreadLocal可能...

    正确理解ThreadLocal.pdf

    在实际应用中,如上文所示的Hibernate示例,通过`set()`方法可以将`Session`对象与当前线程绑定,而`get()`方法则用于获取当前线程的`Session`对象。这种设计模式避免了在多线程环境中直接操作共享资源可能带来的...

    hibernate常用方法集合

    `HibernateSessionFactory` 类是Hibernate应用中常见的一个工具类,用于管理和提供与当前线程相关的Session实例。让我们详细了解一下`HibernateSessionFactory`类中的关键方法和其背后的原理。 1. **配置和初始化...

    java 中ThreadLocal 的正确用法

    例如,在 HibernateUtil 类中,我们可以定义一个 ThreadLocal 变量来保存 Hibernate 的 Session。 ```java public class HibernateUtil { private static Log log = LogFactory.getLog(HibernateUtil.class); ...

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

    本文将深入探讨Hibernate中的事务处理,特别是“当前线程中的Session”这一概念,以及如何在实际开发中有效地利用它。 在Hibernate中,Session是与持久化层交互的主要接口,它负责对象的持久化、检索、更新和删除等...

    ThreadLocal源码分析和使用

    ThreadLocal 类中的方法包括: * void set(T value):将此线程局部变量的当前线程副本中的值设置为指定值。 * void remove():移除此线程局部变量当前线程的值。 * protected T initialValue():返回此线程局部变量...

    hibernate源码分析一[启动过程]

    在加载配置文件时,`Configuration`类会优先考虑`hibernate.cfg.xml`中的配置,如果存在相同的配置项,那么`hibernate.cfg.xml`中的值将覆盖`hibernate.properties`中的值。此外,通过`Configuration`类提供的方法,...

    hibernate

    - **自动对象关系映射**:通过配置文件(通常是 XML 文件),Hibernate 能够自动将 Java 对象持久化到数据库中,并能从数据库中加载对象。 **2. Hibernate 架构** - **PO (Persistent Objects 持久化对象)**:这些...

    Hibernager_Session_Manager_ThreadLocal

    每当线程开始处理请求时,会从ThreadLocal中获取或创建一个新的Session。 4. **Session的生命周期管理**:每个线程在开始操作数据库之前,从ThreadLocal获取Session;完成后,关闭Session并清理ThreadLocal中的引用...

    8个案例详解教会你ThreadLocal.docx

    例如,Spring 中的 TransactionTemplate 和 AOP 模块利用 `ThreadLocal` 存储当前事务信息,Hibernate 中的 Session 管理也依赖于 `ThreadLocal` 来保持线程绑定的 Session。 7. **线程安全** - `ThreadLocal` ...

    基于Hibernate的数据持久层关键技术的研究

    2. **ThreadLocal模式**:在多线程环境下,使用ThreadLocal来管理Hibernate的Session可以避免线程安全问题。每个线程都有自己的Session实例,这样可以确保数据访问的线程安全性。 3. **静态工厂方法**:为了提高...

    Hibernate 课件_HQL

    在Hibernate中,通常使用`ThreadLocal`来管理`Session`,确保每个线程拥有自己的`Session`实例,从而避免并发问题。 - **示例**: - 创建一个`ThreadLocal`实例来管理`Session`: - `private static ThreadLocal...

    Jbuilder里配置Hibernate

    接下来,我们需要创建一个名为`HibernateSessionFactory`的类,该类负责初始化Hibernate会话工厂(SessionFactory)并提供获取会话(Session)的方法。具体实现如下: ```java package com.jk2.dao; import org....

Global site tag (gtag.js) - Google Analytics