Hibernate一级缓存:
Hibernate中的一级缓存的理解,一共进行了三次查询。
第一次因为缓存中没有数据所以会去查询数据库,会发出sql语句;
第二次因为在同一个session中,所以可以使用hibernate的一级缓存,所以不发出sql语句(即没有查询数据库);
第三次因为hibernate的一级缓存只能在同一个session中共享数据,所以hibernate到数据库中去查询数据,会发出sql语句。
public void firstCacheOfSession(){
Test test = null;
Session session = null;
try {
session = HibernateSessionFactory.getSession();
session.beginTransaction();
//第一次会发出sql语句,因为没有缓存中没有数据要去数据库中查询
test = (Test) session.get(Test.class, 1);
System.out.println("first :"+test.getName());
//第二次不会发出sql语句,因为在同一个session中,可以到hibernate的一级缓存中取数据
test = (Test) session.get(Test.class, 1);
System.out.println("Second :"+test.getName());
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
session.close();
}
try {
session = HibernateSessionFactory.getSession();
session.beginTransaction();
//第三次会发出sql语句,因为hibernate一级缓存中的数据只能在同一个session中共享,所以在新的session中不能使用hibernate的一级缓存数据。
test = (Test) session.get(Test.class, 1);
System.out.println("Third :"+test.getName());
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
session.close();
}
}
![](http://static.oschina.net/uploads/space/2013/1206/154528_Wenn_1273696.png)
Hibernate二级缓存:
Hibernate二级缓存也称为进程级的缓存或SessionFactory级的缓存。二级缓存是全局缓存,它可以被所有的session共享。二级缓存的生命周期和SessionFactory的生命周期一致,SessionFactory可以管理二级缓存。
使用hibernate的二级缓存后结果如图(配置另见hibernate二级缓存配置文章中,再次就不做介绍了):
可以看到使用了二级缓存后只发出了一条sql语句,是因为二级缓存是将数据存入了SessionFactory中,所以即使在不同的session中也可共享数据。