HibernateDemo2

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);
		}
	}
	
	
}

猜你喜欢

转载自blog.csdn.net/qq_33407846/article/details/80289628
2
>&2
α2
2-2