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 }
如果您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】
本文版权归作者和博客园共有,欢迎转载