HibernateSessionFactory建立-使用ThreadLocal

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

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

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

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

 1 package util;
 2 
 3 import java.io.Serializable;
 4 
 5 import org.hibernate.Session;
 6 import org.hibernate.SessionFactory;
 7 import org.hibernate.cfg.Configuration;
 8 
 9 public class HibernateSessionFactory implements Serializable{
10     private static final String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
11     private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
12     private  static Configuration configuration = new Configuration();    
13     private static SessionFactory sessionFactory=null;
14     private static String configFile = CONFIG_FILE_LOCATION;
15     //static代码块只会在实例化类的时候只执行一次
16     static{
17         try {
18             configuration.configure(configFile);
19             sessionFactory = configuration.buildSessionFactory();
20         } catch (Exception e) {
21             System.err.println("%%%% Error Creating SessionFactory %%%%");
22             e.printStackTrace();
23         }
24         
25     }
26     //获取Session
27     public static Session getCurrentSession(){
28         Session session =  threadLocal.get();
29         //判断Session是否为空,如果为空,将创建一个session,并付给线程变量tLocalsess
30         try {
31             if(session ==null&&!session.isOpen()){
32                 if(sessionFactory==null){
33                     rbuildSessionFactory();
34                 }else{
35                     session = sessionFactory.openSession();
36                 }
37                 //session = (sessionFactory != null) ? sessionFactory.openSession(): null;
38             }
39             threadLocal.set(session);
40         } catch (Exception e) {
41             // TODO: handle exception
42         }
43         
44         return session;
45     }
46     
47     public static void rbuildSessionFactory(){
48         try {
49             configuration.configure(configFile);
50             sessionFactory = configuration.buildSessionFactory();
51         } catch (Exception e) {
52             System.err.println("%%%% Error Creating SessionFactory %%%%");
53             e.printStackTrace();
54         }
55     }
56 }

 

posted @ 2016-11-08 12:31  sincoolvip  阅读(2297)  评论(0编辑  收藏  举报