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 }