1 package cn.jbit.auction.dao; 2 3 import org.hibernate.Session; 4 import org.hibernate.SessionFactory; 5 import org.hibernate.cfg.Configuration; 6 7 public class HibernateUtil { 8 // 初始化一个ThreadLocal对象 9 private static final ThreadLocal sessionTL = new ThreadLocal(); 10 private static Configuration configuration; 11 private final static SessionFactory sessionFactory; 12 static { 13 try { 14 configuration = new Configuration().configure(); 15 sessionFactory = configuration.buildSessionFactory(); 16 } catch (Throwable ex) { 17 throw new ExceptionInInitializerError(ex); 18 } 19 } 20 public static Session currentSession() { 21 //sessionTL的get()方法根据当前线程返回其对应的线程内部变量, 22 //也就是我们需要的Session,多线程情况下共享数据库连接是不安全的。 23 //ThreadLocal保证了每个线程都有自己的Session。 24 Session session = (Session) sessionTL.get(); 25 // 如果session为null,则打开一个新的session 26 if (session == null) { 27 //创建一个数据库连接对象session。 28 session = sessionFactory.openSession(); 29 // 保存该数据库连接session到ThreadLocal中。 30 sessionTL.set(session); 31 } 32 //如果当前线程已经访问过数据库了, 33 //则从sessionTL中get()就可以获取该线程上次获取过的数据库连接对象。 34 return session; 35 } 36 /** 37 * 关闭Session 38 */ 39 public static void closeSession(){ 40 Session session = (Session) sessionTL.get(); 41 sessionTL.set(null); 42 session.close(); 43 } 44 }