Session之于Hibernate,有如Connection之于JDBC,如果有效的管理Session,从而避免不必要的性能开支。
由于Session是非线程安全的,因此在对Session进行重用的时候应该杜绝多线程共享一个Session。因此对Session的管理应该遵循“在线程内共享”的原则。
通过ThreadLocal实现Session管理是比较常用的一种方式,ThreadLocal可以确保获得与当前线程绑定的Session实例,具体代码如下所示:
private static Configuration conf=new Configuration().configure();
private static SessionFactory sessionFactory=conf.buildSessionFactory();
public static final ThreadLocal<Session> threadLocal=new ThreadLocal<Session>();
public static SessionFactory getSessionFactory(){
return sessionFactory;
}
public static Session getCurrentSession(){
Session session=threadLocal.get();
if(session==null){
session=sessionFactory.openSession();
threadLocal.set(session);
}
return session;
}
public static void closeSession(){
Session session=threadLocal.get();
threadLocal.set(null);
if(session!=null){
session.close();
}
}