hibernatesession:使用ThreadLocal模式管理Hibernate的Session

  在利用Hibernate开发DAO模块时我们和Session打交道最多所以如何合理管理Session避免Session频繁创建和销毁对于提高系统性能来说是非常重要我们知道Session是由 SessionFactory负责创建而SessionFactory实现是线程安全多个并发线程可以同时访问个 SessionFactory并从中获取Session例子那么Session是否是线程安全呢?很遗憾答案是否定Session中包含了数据库操作相关状态信息那么说如果多个线程同时使用个Session例子进行CRUD就很有可能导致数据存取混乱你能够想像那些你根本不能预测执行顺序线程对你条记录进行操作情形吗? 在Session众多管理方案中我们今天来认识种名ThreadLocal模式解决方案早在Java1.2推出的时Java平台中就引入了个新支持:java.lang.ThreadLocal给我们在编写多线程时提供了种新选择ThreadLocal是什么呢?其实ThreadLocal并非是个线程本地实现版本它并不是个Thread而是thread local variable(线程局部变量)也许把它命名为ThreadLocalVar更加合适线程局部变量(ThreadLocal)其实功用非常简单就是为每个使用该变量线程都提供个变量值副本是每个线程都可以独立地改变自己副本而不会和其它线程副本冲突从线程角度看就好像每个线程都完全拥有个该变量 ThreadLocal是如何做到为每个线程维护变量副本呢?其实实现思路很简单在ThreadLocal类中有个Map用于存储每个线程变量副本比如下面举例实现(为了简单没有考虑集合泛型):

  例子:

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
 
public MySessionFactory {
 
    private final ThreadLocal<Session> threadLocal = ThreadLocal<Session>;
 
    private final Configuration cfg = Configuration;
 
    private SessionFactory factory = null;
 
    public Session currentSession throws HibernateException {
       Session session = (Session) threadLocal.get;
       (session null) {
           (factory null) {
              try {
                  cfg.configure;
                  factory = cfg.buildSessionFactory;
              } catch (Exception ex) {
                  ex.prStackTrace;
              }
           }
           session = factory.openSession;
           threadLocal.(session);
       }
       session;
    }
}


Tags:  threadlocal例子 javathreadlocal threadlocal hibernatesession

延伸阅读

最新评论

发表评论