1、先晒代码
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
/**
* 使用单例模式
* @author limingxing
*
*/
public class HbmSession {
//准备会话工程
private static SessionFactory factory = null;
//线程本地变量,用存储session的副本
private static ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
//外部不能再通过默认的构造方法来创建此对象
private HbmSession(){
}
//静态代码块
static{
factory = new Configuration().configure().buildSessionFactory();
}
//取得session
public static Session getSession(){
Session session = threadLocal.get();
if(session == null){
//开启新会话
session = factory.openSession();
//将新创建的会话保存到本地线程中
threadLocal.set(session);
}
return session;
}
//关闭session
public static void closeSession(){
Session session = threadLocal.get();
if(session != null && session.isOpen()){
//关闭会话
session.close();
//清空线程本地的会话变量
threadLocal.set(null);
}
}
}
2、技术点分析
这里主要使用单例模式中的饿汉式,当多个线程使用一个session时,效率非常的慢,在这个工具类中添加了ThreadLocal线程本地变量,这样一个session就会出现副本,多个线程同时调用时,可以使用副本session,使用副本就像使用本身一样,加快了效率。