HibernateSessionFactory类进行单例SessionFactory的创建于线程安全的Session控制
ThreadLocal让一次程序的运行来使用一个Session,而所有的Session都公用一个SessionFacotry,这样做有3个好处:
1.让所有用户共用一个SessionFactory,避免了重复创建SessionFactory而造成的资源浪费;
2.为每一个用户访问都创建一个Session,避免了不同用户之间的Session冲突;
3.在每一次程序运行的周期内,共用一个Session,既可以避免资源浪费,有提供了资源的共享,让一次运行的多个操作共用一个Session资源,为事务的操作也提供了基础。package com.util; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistryBuilder; public class HibernateSessionFactory { private static Configuration configuration = new Configuration(); private static ServiceRegistry serviceRegistry; private static SessionFactory sessionFactory; private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>(); static{ configuration.configure(); serviceRegistry = new ServiceRegistryBuilder() .applySettings(configuration.getProperties()) .buildServiceRegistry(); sessionFactory = configuration.buildSessionFactory(serviceRegistry); } public static Session getSession(){ Session session = threadLocal.get(); if(session==null || !session.isOpen()){ if(sessionFactory==null){ rebuildSessionFactory(); } session = sessionFactory!=null ? sessionFactory.openSession() : null; threadLocal.set(session); } return session; } private static void rebuildSessionFactory() { configuration.configure(); serviceRegistry = new ServiceRegistryBuilder() .applySettings(configuration.getProperties()) .buildServiceRegistry(); sessionFactory = configuration.buildSessionFactory(serviceRegistry); } public static void closeSession(){ Session session = threadLocal.get(); if(session!=null){ session.close(); threadLocal.set(null); } } }