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

原创 2012年03月28日 23:05:04

如果每次操作数据都开启一次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;
	}

	

}


JAVA学习篇--ThreadLocal,Java中特殊的线程绑定机制

在DRP项目中,我们使用了ThreadLocal来创建Connection连接,避免了一直以参数的形式将Connection向下传递(传递connection的目的是由于jdbc事务要求确保使用同一个...
  • hejingyuan6
  • hejingyuan6
  • 2014年07月17日 09:05
  • 6240

SpringMvc学习心得(四)springmvc中request的线程安全问题

本文分析了springmvc如何保证request对象的线程安全
  • csluanbin
  • csluanbin
  • 2016年03月19日 11:25
  • 7318

tomcat里的servlet就是线程相关的问题!

平时的开发中线程是个少不了的东西,比如tomcat里的servlet就是线程,没有线程我们如何提供多用户访问呢?不过很多刚开始接触线程的开发工程师却在这个上面吃了不少苦头。怎么做一套简便的线程开发模式...
  • u012402926
  • u012402926
  • 2016年12月14日 16:38
  • 456

C# 中关闭当前线程的四种方式

转自:http://blog.csdn.net/yang1994/article/details/7947198 net类库已经帮助我们实现了窗口的关闭,如果此窗口是系统的主窗口,关闭此窗口即应...
  • u012252959
  • u012252959
  • 2016年01月12日 14:40
  • 9664

线程的基本属性(分离,栈大小,保护区,竞争,调度并发)以及TSD特定数据

线程的属性:   我们知道,在创建一个线程的时候可以指定一个线程的属性,通过第二个参数来指定:pthread_attr_t  *attr.   一般情况下,我们都将这个参数设置为空,表示这个线程使用的...
  • msdnwolaile
  • msdnwolaile
  • 2016年08月06日 16:47
  • 523

web应用中通常将session绑定到当前线程上

hibernate.current_session_context_class属性配置 此设置的作用如下: sessionFactory.getCurrentSession()可以完成一系列的...
  • H12KJGJ
  • H12KJGJ
  • 2016年10月30日 19:08
  • 1702

当前日期所在的星期范围

private void convertWeekByDate(Date time) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M...
  • u010138825
  • u010138825
  • 2016年02月19日 14:28
  • 112

如何终止Java线程

原文地址:http://blog.csdn.net/anhuidelinger/article/details/11746365    终止线程的三种方法      有三种方法可以使终止线程。  ...
  • tanga842428
  • tanga842428
  • 2016年10月02日 11:03
  • 1115

线程 NSThread 多线程 获取当前线程

线程 NSThread 多线程 线程与进程 进程 是一个活动的程序,一个容器 是系统资源管理的最小单位 切换代价较高 线程 是在进程容器中运行,实际工作的代码 是程序执行的最小单位 切换代价较低(由于...
  • qq871531334
  • qq871531334
  • 2014年02月21日 18:55
  • 8112

JAVA中的多线程操作。线程等待、阻塞、让步,挂起 等

挂起:一般是主动的,由系统或程序发出,甚至于辅存中去。(不释放CPU,可能释放内存,放在外存) 阻塞:一般是被动的,在抢占资源中得不到资源,被动的挂起在内存,等待某种资源或信号量(即有了资源)将...
  • LoveStudy_girl
  • LoveStudy_girl
  • 2016年09月02日 10:16
  • 4390
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:打造当前请求(线程)范围的HibernateSession
举报原因:
原因补充:

(最多只允许输入30个字)