打造当前请求(线程)范围的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;
	}

	

}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

黑马程序员--javaSE--ThreadLocal实现线程范围的共享变量

------- android培训、java培训、期待与您交流! ---------- 在写这篇博客之前,我登了下黑马论坛,想看一下自己提出的string和null的问题有回应没, 却意外地发现自己...

Java高并发编程:线程范围内共享数据

笔记摘要所谓线程范围内共享数据,即对于相同的程序代码,多个模块在同一个线程中运行时要共享一份数据,而在另外线程中运行时又共享另外一份数据,API中为我们提供了一个操作线程范围内共享数据的类Thread...

(5)ThreadLocal类及应用技巧---- 线程范围内共享变量

java.lang  类 ThreadLocal java.lang.Object   java.lang.ThreadLocal 直接已知子类:  InheritableThrea...

5、ThreadLocals实现线程范围内的共享变量

线程范围内的共享数据 1、未实现线程共享变量 package cn.itcast.heima2; import java.util.HashMap; import jav...

线程范围内共享变量使用ThreadLocal类详细方法

class ThreadLocal 其中get()方法:取得当前线程范围内共享变量的值。 set()方法:把当前共享变量的值存到ThreadLocal(T)里面。 即get()是得到Th...

ThreadLocal实现线程范围的共享变量

这里先说下ThreadLocal不是一个线程的本地实现版本,不是一个Thread,它是thread local variable(线程局部变量);用于实现线程内的数据共享,即对于相同的程序代码,多个模...

ThreadLocal 线程范围内的共享变量

ThreadLocal       其实 ThreadLocal 并非是一个线程的本地实现,它并不是一个 Thread ,而是 Thread Local Variable(线程局部变量),它的功能就是...

(4)传智播客_张孝祥_线程范围内共享变量的概念与作用

package com.itm.thread; import java.util.Random; public class ThreadScopeShareData { private sta...

线程范围内共享数据(二)

本篇讲述通过ThreadLocal类来实现线程范围内共享数据 代码如下: public class ThreadLocalShare { private static ThreadLocal...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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