`
birdmen
  • 浏览: 38439 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Hibernate Session浅析

阅读更多
   Hibernate的基本特征是完成面向对象的程序设计语言到关系数据库的映射,在Hibernate中使用持久化对象PO(Persistent Object)完成持久化操作,对PO的操作必须在Session管理下才能同步到数据库,但是这里的Session并非指HttpSession,可以理解为基于JDBC的Connnection,Session是Hibernate运作的中心,对象的生命周期、事务的管理、数据库的存取都与Session息息相关,首先,我们需要知道,SessionFactory负责创建Session,SessionFactory是线程安全的,多个并发线程可以同时访问一个SessionFactory 并从中获取Session实例。而Session并非线程安全,也就是说,如果多个线程同时使用一个Session实例进行数据存取,则将会导致Session 数据存取逻辑混乱.因此创建的Session实例必须在本地存取空上运行,使之总与当前的线程相关。

  这里就需要用到ThreadLocal,在很多种Session 管理方案中都用到了它.ThreadLocal 是Java中一种较为特殊的线程绑定机制,通过ThreadLocal存取的数据,总是与当前线程相关,也就是说,JVM 为每个运行的线程,绑定了私有的本地实例存取空间,从而为多线程环境常出现的并发访问问题提供了一种隔离机制,ThreadLocal并不是线程本地化的实现,而是线程局部变量。

也就是说每个使用该变量的线程都必须为该变量提供一个副本,每个线程改变该变量的值仅仅是改变该副本的值,而不会影响其他线程的该变量的值,ThreadLocal是隔离多个线程的数据共享,不存在多个线程之间共享资源,因此不再需要对线程同步。


请看一下代码:
public class HibernateUtil {  
 
public static final SessionFactory sessionFactory;  
public static final ThreadLocal session = new ThreadLocal();  
 
static{  
 
try{  
 
    Configuration configuration=new Configuration().configure();   
    sessionFactory = configuration.buildSessionFactory();  
 
}catch (Throwable ex){  
 
    System.err.println("Initial SessionFactory creation failed." + ex);  
    throw new ExceptionInInitializerError(ex);  
}  
}  
 
public static Session currentSession() throws HibernateException{  
    Session s = (Session) session.get();  
    if (s == null)  
    {  
       s = sessionFactory.openSession();  
       session.set(s);  
    }  
    return s;  
}  
 
public static void closeSession() throws HibernateException {  
    Session s = (Session) session.get();  
    if (s != null)  
    s.close();  
    session.set(null);  
   }  
} 


   无论是立即加载还是延迟加载必须要连接数据库的,而在java中连接数据库是依赖java.sql.Connection,在Hibernate session就是Connection的一层高级封装,一个session对应了一个Connection,要实现延迟加载必须有session才行. 而且要进行延迟加载还必须保证是同一个session才行,用另外一个session去延迟加载前一个session的代理对象是不行的.大家都知道 Connection是使用过后必须要进行关闭的,那么我们如何保证一次http请求过程中,一直都使用一个session呢,即一个 Connection呢.而且还要保证http请求结束后正确的关闭.
   好,现在我们知道了我们要解决的问题:
   1.如何保证http请求结束后正确的关闭session;
   2.如何保证http请求过程中一直使用同一个session;
   第一个问题很容易想到,使用过滤器:

  
   public void doFilter(ServletRequest request, 
     ServletResponse response,FilterChain filterChain) {  
     try {  
        filterChain.doFilter(request, response);  
     }  
     catch (IOException e) {  
        e.printStackTrace();  
     }  
     catch (ServletException e) {  
        e.printStackTrace();  
     }  
     finally {  
        try {  
            HibernateUtil.commitTransaction();  
        }  
        catch (Exception e) {  
            HibernateUtil.rollbackTransaction();  
        }  
        finally {  
            HibernateUtil.closeSession();  
        }  
     }  
   } 
   



  要解决第二个问题我们必须先搞清楚,http请求在java中是以什么样的机制实现的,在java中一个请求就是一个线程,像流行的web容器 Tomcat等,往往都是采用线程池机制的也就是说有n个线程在池子里面,每当有http请求时,随机从线程池中取出一个线程对象去处理请求,实际上多次请求可能使用的是同一线程也可能不是,这是随机的.要保证整个请求中使用同一session最容易想到的就是把这个session绑定到线程上,在 java中使用ThreadLocal可以轻松绑定变量,每个线程有一个自己的ThreadLocal,这个ThreadLocal会随线程的销毁一起销毁,既然是每个线程有一个那么多个线程间自然是不会有影响了,所以把session绑定在ThreadLocal里面是最好的选择了,ThreadLocal在Hibernate中的应用在本文伊始已做了说明。现在来看一下ThreadLocal类本身的实现:

    public Object get() {  
        Thread t = Thread.currentThread();  
        ThreadLocalMap map = getMap(t);  
        if (map != null)   
            return map.get(this);  
  
        // Maps are constructed lazily.  if the map for this thread  
        // doesn't exist, create it, with this ThreadLocal and its  
        // initial value as its only entry.  
        Object value = initialValue();  
        createMap(t, value);  
        return value;  
    }  
  
    ThreadLocalMap getMap(Thread t) {  
        return t.threadLocals;  
    }  
  
    void createMap(Thread t, Object firstValue) {  
        t.threadLocals = new ThreadLocalMap(this, firstValue);  
    }

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    org.hibernate.HibernateException: No Hibernate Session bound to thread

    Hibernate Session 绑定线程解决方案 在 Java web 开发中, Hibernate 是一个非常流行的 ORM(Object-Relational Mapping)框架,用于将 Java 对象映射到关系数据库中。然而,在使用 Hibernate 进行数据库操作时,...

    Hibernate-nosession

    然而,在某些特定场景下,我们可能并不需要频繁地打开和关闭Session,这时“Hibernate-nosession”就显得尤为重要。本文将深入探讨Hibernate-nosession的概念、应用场景以及如何在实际代码中实现。 首先,理解什么...

    Hibernate Session释放模式

    在Java的持久化框架Hibernate中,Session对象是与数据库交互的核心组件,它负责管理对象的持久状态。在处理大量数据或者长时间运行的事务时,合理地管理Session的生命周期至关重要,这就涉及到了Hibernate的Session...

    hibernate session生命周期示例

    本示例将深入探讨Hibernate Session的生命周期及其使用,帮助你更好地理解和运用这个强大的工具。 Hibernate Session是Hibernate的核心接口,它是与数据库交互的主要接口。Session对象负责管理实体对象的状态,包括...

    Hibernate_Session_Transaction

    在Java的持久化框架Hibernate中,`Session`和`Transaction`是两个至关重要的概念,它们在数据管理和事务处理中起到核心作用。这篇文章将深入解析这两个概念及其相关知识点。 `Session`是Hibernate提供的一种与...

    hibernate和session学习

    【hibernate与Session详解】 Hibernate 是一个强大的Java对象关系映射(ORM)框架,它为开发者提供了在Java应用程序中操作数据库的强大工具。通过Hibernate,我们可以将数据库中的表与Java类进行映射,从而实现对...

    重写hibernate的session简单增删改查

    "重写hibernate的session简单增删改查"是一个针对初学者的实践教程,旨在帮助理解如何在Hibernate中自定义Session的操作,以便更好地控制数据库交互。 一、Hibernate Session Hibernate的Session是与数据库交互的...

    Hibernate(session管理)

    本文将深入探讨Hibernate中的核心概念——Session管理。 首先,理解Session在Hibernate中的角色至关重要。Session是Hibernate的主要工作单元,它是应用程序与数据库之间的桥梁。它负责保存、检索和更新Java对象,...

    Hibernate的Session的javadoc

    Hibernate的Session接口是Java应用程序与Hibernate之间主要的运行时交互接口,它提供了对持久化对象的创建、读取和删除操作。Session的概念是基于对象的状态管理和数据库事务的,它的生命周期通常与一个物理事务绑定...

    hibernate session详细方法,值得珍藏

    ### Hibernate Session 详解:值得珍藏的深度解析 在Java持久化领域,Hibernate无疑占据了举足轻重的地位,而`Hibernate Session`则是其中的核心组件之一,它提供了与数据库交互的主要接口,是对象/关系映射(ORM)...

    hibernate中session的管理

    在Hibernate框架中,Session是与数据库交互的主要接口,它负责对象的持久化操作。然而,由于Session不是线程安全的,所以在多线程环境中管理Session就需要特别注意。本篇文章将详细探讨Hibernate中Session的管理,...

    hibernate session.doc

    在理解Hibernate框架中,Session是核心组件之一,它充当了应用程序和数据库之间的桥梁。`Session`接口提供了多种操作,如创建、更新、查询和删除数据,这些都是基于对象关系映射(ORM)的概念进行的。本篇文章将深入...

    Hibernate_session_factory_配置.docx

    在Java的持久层框架Hibernate中,SessionFactory是核心组件之一,它是线程安全的,负责创建Session对象,每个Session对应于数据库的一次会话。配置SessionFactory主要是通过Hibernate的配置文件(通常为hibernate....

    HibernateSession , Transaction 研究

    本文将深入研究Hibernate中的`Session`和`Transaction`,这两个概念是理解Hibernate工作原理的关键。 首先,让我们了解`Session`。在Hibernate中,`Session`充当了应用程序与数据库之间的桥梁,它是持久化操作的...

    hibernate中session对象的状态详解

    hibernate中session对象的状态详解

    JavaEE技术-自主学习.zip_hibernate_hibernate session _javaee映射.xml

    然后,我们模拟Hibernate的Session接口,这是操作数据库的主要入口。Session提供了保存、删除、更新和查询对象的方法。例如: ```java SessionFactory sessionFactory = Configuration().configure()....

    hibernate02:session对象、hql查询、在线查询也叫对象查询、离线查询

    本话题主要聚焦于`Hibernate02`,涵盖`Session`对象、HQL(Hibernate Query Language)查询以及在线查询和离线查询的概念。 首先,我们来详细讨论`Session`对象。在Hibernate中,`Session`是应用程序与数据库之间的...

    Hibernate_11session

    《深入理解Hibernate Session:从配置到实践》 Hibernate,作为Java领域中一款广泛使用的对象关系映射(ORM)框架,极大地简化了数据库操作。在Hibernate中,Session是连接应用程序和数据库的重要桥梁,它负责对象...

    Hibernate Session 4种对象状态.docx

    当一个对象刚刚被创建,并未通过Hibernate的Session接口进行任何操作时,它处于临时状态。此时,对象未与数据库中的任何记录关联,没有被分配唯一的数据库ID,如果对象发生改变,不会影响数据库中的数据。 2. **...

    HIbernate Session 详解

    ### HIbernate Session 详解 #### 一、Session在Hibernate中的地位及作用 在Hibernate框架中,`Session` 是一个非常核心且重要的组件。作为Hibernate提供的主要操作数据库的接口,`Session` 不仅承担着保存、更新...

Global site tag (gtag.js) - Google Analytics