打造当前请求(线程)范围的HibernateSession

如果每次操作数据都开启一次session是不是太浪费了。由此、写了下当前请求也就是当前线程范围使用的Session。

直接上代码了、不知道是不是有什么问题没注意到?有的话请指正。

package com.oa.hibernate.utils;


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

/**
 *
 * @author:zll
 * 2012-3-28 上午07:24:00
 * description:当前线程(请求)范围的Session工具类
 */
public class HibernateSessionUtil {

	private static final String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
	private static String configFile = CONFIG_FILE_LOCATION;
	
	private static SessionFactory sf = null;
	
	//当前线程相关的session
	private static final ThreadLocal<Session> localSession = new ThreadLocal<Session>(){
		protected Session initialValue() {
			return sf.openSession();
		};
	};
	
	private HibernateSessionUtil() {
	}
	
	static{
		try {
			//采用默认的设置
			sf = new Configuration().configure(configFile).buildSessionFactory();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	/**
	 * 得到当前的session
	 * @return
	 */
	public static Session getCurrentSession(){
		Session session  = localSession.get();
		if (session ==null || !session.isOpen()) {
			if (sf == null) {
				rebuildSessionFactory();
			}
			session = (sf!=null)? sf.openSession():null;
			localSession.set(session);
		}
		return session;
	}
	/**
     * 重新加载SessionFactory
     *
     */
	public static void rebuildSessionFactory() {
		try {
			sf = new Configuration().configure(configFile).buildSessionFactory();
		} catch (Exception e) {
			System.err
					.println("%%%% Error Creating SessionFactory %%%%");
			e.printStackTrace();
		}
	}


	/**
     *  关闭当前的session
     *
     *  @throws HibernateException
     */
    public static void closeCurrentSession() {
        Session session =localSession.get();
        localSession.set(null);
        if (session != null && session.isOpen()) {
            session.close();
        }
    }

	/**
     *  返回SessionFactory
     *
     */
	public static org.hibernate.SessionFactory getSessionFactory() {
		return sf;
	}

	/**
	 * 设置config路径 SessionFactory将在下次重新加载
	 * @param configFile
	 */
	public static void setConfigFile(String configFile){
		HibernateSessionUtil.configFile = configFile;
		sf = null;
	}

	

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值