码迷,mamicode.com
首页 > Web开发 > 详细

HibernateSessionFactory建立-使用ThreadLocal

时间:2016-11-08 14:19:50      阅读:305      评论:0      收藏:0      [点我收藏+]

标签:线程   oca   数据   pack   read   nts   adl   cti   hand   

立即加载还是延迟加载必须要连接数据库的,而在Java中连接数据库是依赖java.sql.Connection,在hibernate中session就是Connection的一层高级封装,一个session对应了一个Connection,要实现延迟加载必须有session才行.而且要进行延迟加载还必须保证是同一个session才行,用另外一个session去延迟加载前一个session的代理对象是不行的.大家都知道Connection是使用过后必须要进行关闭的,那么我们如何保证一次http请求过程中,一直都使用一个session呢,即一个Connection呢.而且还要保证http请求结束后正确的关闭.

好,现在我们知道了我们要解决的问题

1.如何保证http请求结束后正确的关闭session

2.如何保证http请求过程中一直使用同一个session

package util;

import java.io.Serializable;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateSessionFactory implements Serializable{
    private static final String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
    private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
    private  static Configuration configuration = new Configuration();    
    private static SessionFactory sessionFactory=null;
    private static String configFile = CONFIG_FILE_LOCATION;
    //static代码块只会在实例化类的时候只执行一次
    static{
        try {
            configuration.configure(configFile);
            sessionFactory = configuration.buildSessionFactory();
        } catch (Exception e) {
            System.err.println("%%%% Error Creating SessionFactory %%%%");
            e.printStackTrace();
        }
        
    }
    //获取Session
    public static Session getCurrentSession(){
        Session session =  threadLocal.get();
        //判断Session是否为空,如果为空,将创建一个session,并付给线程变量tLocalsess
        try {
            if(session ==null&&!session.isOpen()){
                if(sessionFactory==null){
                    rbuildSessionFactory();
                }else{
                    session = sessionFactory.openSession();
                }
                //session = (sessionFactory != null) ? sessionFactory.openSession(): null;
            }
            threadLocal.set(session);
        } catch (Exception e) {
            // TODO: handle exception
        }
        
        return session;
    }
    
    public static void rbuildSessionFactory(){
        try {
            configuration.configure(configFile);
            sessionFactory = configuration.buildSessionFactory();
        } catch (Exception e) {
            System.err.println("%%%% Error Creating SessionFactory %%%%");
            e.printStackTrace();
        }
    }
}

 

HibernateSessionFactory建立-使用ThreadLocal

标签:线程   oca   数据   pack   read   nts   adl   cti   hand   

原文地址:http://www.cnblogs.com/sincoolvip/p/6042563.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!