用ThreadLocal,模拟Hibernate getCurrentSession()

用ThreadLocal线程局部变量,模拟Hibernate的 SessionFactory.getCurrentSession()


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

//用ThreadLocal线程局部变量,模拟Hibernate的 SessionFactory.getCurrentSession();

public class HibernateUtil
{
	//每线程都有一份Session
	private static final ThreadLocal<Session> localSession = new ThreadLocal<Session>();
	
	private static SessionFactory sessionFactory;
	
	static
	{
		try
		{
			sessionFactory = new Configuration().configure()
					.buildSessionFactory();
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}
	
	public static Session getCurrentSession()
	{
		if(localSession.get() == null)
			localSession.set(sessionFactory.openSession());
		
		return localSession.get();
	}
}



     那么ThreadLocal怎样实现线程局部变量 呢??先不看JDK源码的话,最简就是每线程都增加一个private的属性XX,然后getXX()就

可以取得但这样每增加一个"线程局部变量"就要在java.lang.Thread里增加一个属性的话,那太多了,这太不好...

    那JDK源码里是每个线程里都有一个Map,java.lang.Thread 里有个ThreadLocalMap threadLocals 的属性,里面存放

(ThreadLocal key,Object value)这样的<key,value>对,相当于每线程都有这个的Map: Map<ThreadLocal,Object>,

     这样上述代码中,每线程都可以将 <localSession,Session> 这样的条目放进线程的ThreadLocalMap里...  


你可能感兴趣的:(jdk,exception,Hibernate,object,session,import)