//MySessionFactory的构成;
public class MySessionFactory {
private static SessionFactory factory;
//为了防止多个线程中同时拿到一个session对象,采取ThreadLocal锁的方式.
private static ThreadLocal<Session> tl;
static{
Configuration config = new Configuration().configure();
factory = config.buildSessionFactory();
//实例化线程本地变量
tl = new ThreadLocal<Session>();
}
public static Session getSession(){
//拿session之前首先看看自己的线程本地变量中是否存在连接,如果有直接从线程本地变量中取,没有再去从连接池中获得.
//ThreadLocal线程本地变量的get方法可以从本地变量对象中获得保存并锁定的对象.
Session session = tl.get();
if(session == null){
//本地变量中没有连接,从连接池获得
session = factory.openSession();
//从连接池获得连接后,注意需要装入线程本地变量中进行保存并锁定.
tl.set(session);
}
return session;
}
public static void close(){
//关闭连接时,首先从线程本地变量中获得连接对象
Session session = tl.get();
//判断是否从本地变量中获得了连接
if(session != null){
//如果存在连接,关闭
session.close();
//清空本地线程变量中已经关闭无法再使用的连接对象session
tl.set(null);
}
}
}