Session工厂类:
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.stat.Statistics;
public class HibernateSessionFactory {
private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
private static Configuration configuration = new Configuration();
private static SessionFactory sessionFactory;
private static String configFile = CONFIG_FILE_LOCATION;
static {
sessionFactory = configuration.configure(configFile).buildSessionFactory();
}
private HibernateSessionFactory(){
}
public static Session getSession(){
Session session = threadLocal.get();
if(session == null || !session.isOpen()){
session = (sessionFactory != null) ? sessionFactory.openSession():null;
threadLocal.set(session);
}
return session;
}
public static Statistics getstat(){
return sessionFactory.getStatistics();
}
public static void close(){
sessionFactory.close();
}
}
Scenario1:
每次开启一个新的session,提交事物后关闭session。
Session session = HibernateSessionFactory.getSession();
Transaction trans = session.beginTransaction();
Stu stu = (Stu) session.get(Stu.class, 1);
System.out.println(stu.getSdept());
trans.commit();
session.close();
System.out.println("-------------------------------------");
session = HibernateSessionFactory.getSession();
trans = session.beginTransaction();
Stu stu2 = (Stu) session.get(Stu.class, 1);
System.out.println(stu2.getSdept());
trans.commit();
session.close();
System.out.println("-------------------------------------");
System.out.println("stu==stu2 result is "+(stu==stu2));
System.out.println("-------------------------------------");
Session session2 = HibernateSessionFactory.getSession();
trans = session2.beginTransaction();
Stu stu3 = (Stu) session2.get(Stu.class, 1);
System.out.println(stu3.getSdept());
trans.commit();
session2.close();
System.out.println("-------------------------------------");
HibernateSessionFactory.close();
运行结果:
Hibernate:
select
stu0_.sno as sno1_2_0_,
stu0_.sname as sname2_2_0_,
stu0_.sex as sex3_2_0_,
stu0_.age as age4_2_0_,
stu0_.sdept as sdept5_2_0_
from
test.stu stu0_
where
stu0_.sno=?
Computer Information Colleague
-------------------------------------
Hibernate:
select
stu0_.sno as sno1_2_0_,
stu0_.sname as sname2_2_0_,
stu0_.sex as sex3_2_0_,
stu0_.age as age4_2_0_,
stu0_.sdept as sdept5_2_0_
from
test.stu stu0_
where
stu0_.sno=?
Computer Information Colleague
-------------------------------------
stu==stu2 result is false
-------------------------------------
Hibernate:
select
stu0_.sno as sno1_2_0_,
stu0_.sname as sname2_2_0_,
stu0_.sex as sex3_2_0_,
stu0_.age as age4_2_0_,
stu0_.sdept as sdept5_2_0_
from
test.stu stu0_
where
stu0_.sno=?
Computer Information Colleague
-------------------------------------
说明: 因为session在事物提交后被关闭了,所以每次hibernate都要执行一次查询
Scenario:2
注掉第一个查询的session关闭方法
Session session = HibernateSessionFactory.getSession();
Transaction trans = session.beginTransaction();
Stu stu = (Stu) session.get(Stu.class, 1);
System.out.println(stu.getSdept());
trans.commit();
//将此次关闭session给注掉
// session.close();
System.out.println("-------------------------------------");
session = HibernateSessionFactory.getSession();
trans = session.beginTransaction();
Stu stu2 = (Stu) session.get(Stu.class, 1);
System.out.println(stu2.getSdept());
trans.commit();
session.close();
System.out.println("-------------------------------------");
System.out.println("stu==stu2 result is "+(stu==stu2));
System.out.println("-------------------------------------");
Session session2 = HibernateSessionFactory.getSession();
trans = session2.beginTransaction();
Stu stu3 = (Stu) session2.get(Stu.class, 1);
System.out.println(stu3.getSdept());
trans.commit();
session2.close();
System.out.println("-------------------------------------");
HibernateSessionFactory.close();
运行结果:
Hibernate:
select
stu0_.sno as sno1_2_0_,
stu0_.sname as sname2_2_0_,
stu0_.sex as sex3_2_0_,
stu0_.age as age4_2_0_,
stu0_.sdept as sdept5_2_0_
from
test.stu stu0_
where
stu0_.sno=?
Computer Information Colleague
-------------------------------------
Computer Information Colleague
-------------------------------------
stu==stu2 result is true
-------------------------------------
Hibernate:
select
stu0_.sno as sno1_2_0_,
stu0_.sname as sname2_2_0_,
stu0_.sex as sex3_2_0_,
stu0_.age as age4_2_0_,
stu0_.sdept as sdept5_2_0_
from
test.stu stu0_
where
stu0_.sno=?
Computer Information Colleague
-------------------------------------
说明: 第二个查询并没有执行数据库查询操作,而是使用的第一次查询的缓存。可以看到stu==stu2 result is true,说明stu和stu2其实指向的是同一个对象。
Scenario3:
将第二个session关闭的操作注掉。
Session session = HibernateSessionFactory.getSession();
Transaction trans = session.beginTransaction();
Stu stu = (Stu) session.get(Stu.class, 1);
System.out.println(stu.getSdept());
trans.commit();
session.close();
System.out.println("-------------------------------------");
session = HibernateSessionFactory.getSession();
trans = session.beginTransaction();
Stu stu2 = (Stu) session.get(Stu.class, 1);
System.out.println(stu2.getSdept());
trans.commit();
//将第二个session关闭的操作注掉
// session.close();
System.out.println("-------------------------------------");
System.out.println("stu==stu2 result is "+(stu==stu2));
System.out.println("-------------------------------------");
Session session2 = HibernateSessionFactory.getSession();
trans = session2.beginTransaction();
Stu stu3 = (Stu) session2.get(Stu.class, 1);
System.out.println(stu3.getSdept());
trans.commit();
session2.close();
System.out.println("-------------------------------------");
HibernateSessionFactory.close();
运行结果:
Hibernate:
select
stu0_.sno as sno1_2_0_,
stu0_.sname as sname2_2_0_,
stu0_.sex as sex3_2_0_,
stu0_.age as age4_2_0_,
stu0_.sdept as sdept5_2_0_
from
test.stu stu0_
where
stu0_.sno=?
Computer Information Colleague
-------------------------------------
Hibernate:
select
stu0_.sno as sno1_2_0_,
stu0_.sname as sname2_2_0_,
stu0_.sex as sex3_2_0_,
stu0_.age as age4_2_0_,
stu0_.sdept as sdept5_2_0_
from
test.stu stu0_
where
stu0_.sno=?
Computer Information Colleague
-------------------------------------
stu==stu2 result is false
-------------------------------------
Computer Information Colleague
-------------------------------------
说明: 第三个查询就是用到第二个查询的缓存结果,虽然创建了新的session,但是并没有真正执行查询操作。