一 深入探讨
在SessionFactory启动的时候,Hibernate会根据配置创建相应的CurrentSessionContext,在getCurrentSession()被调用的时候,实际被执行的方法是CurrentSessionContext.currentSession()。在currentSession()执行时,如果当前Session为空,currentSession会调用SessionFactory的openSession。
二 升级MySessionFactory
我们对获取MySessionFactory的工具类进行升级,让它可以直接返回全新的session和线程相关的session。
三 升级后的代码
package com.cakin.util;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
final public class HibernateUtil { //SqlHelper
private static SessionFactory sessionFactory=null;
//使用线程局部模式
private static ThreadLocal<Session> threadLocal=new ThreadLocal<Session>();
private HibernateUtil(){};
static {
sessionFactory=new Configuration().configure().buildSessionFactory();
}
//获取全新的全新的sesession
public static Session openSession(){
return sessionFactory.openSession();
}
//获取和线程关联的session
public static Session getCurrentSession(){
Session session=threadLocal.get();
//判断是否得到
if(session==null){
session=sessionFactory.openSession();
//把session对象设置到 threadLocal,相当于该session已经和线程绑定
threadLocal.set(session);
}
return session;
}
}
四 测试代码和测试结果
package com.cakin.view;
import java.util.Date;
import javax.management.RuntimeErrorException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import com.cakin.domain.Employee;
import com.cakin.util.HibernateUtil;
import com.cakin.util.MySessionFactory;
public class TestMain {
/**
* @param args
*/
public static void main(String[] args) {
Session session1= HibernateUtil.openSession();
Session session2= HibernateUtil.openSession();
Session session3= HibernateUtil.getCurrentSession();
Session session4= HibernateUtil.getCurrentSession();
System.out.println(session1.hashCode()+":"+session2.hashCode());
System.out.println(session3.hashCode()+":"+session4.hashCode());
}
}
1467214962:2074631480
1786791668:1786791668
五 怎样理解线程局部模式