一、Hibernate缓存
1、什么是缓存?
Hibernate中用到了缓存的概念,那么什么是缓存呢?这里介绍的缓存并不是指计算机的内存或者CPU的一二级缓存,这里的缓存是指为了降低程序对物理数据源访问的频次,从而提高程序运行性能的一种策略。
2、为什么要使用缓存?
为什么Hibernate要使用缓存呢?可以从三点进行分析:(1)Hibernate是一个ORM框架,ORM框架访问数据库的效率直接影响应用程序的运行速度,提升和优化ORM框架的执行效率至关重要;(2)Hibernate的缓存是提升和优化Hibernate执行效率的重要手段,所以学会Hibernate缓存的使用和配置是优化的关键;(3)评判一个ORM框架是否优秀,访问数据库的频次就一个重要的标准
3、缓存使如何工作的?
Hibernate缓存就是将数据库中的数据存储在内存中,缓存的一般工作原理可以通过下图来进行分析(图片摘自慕课网)。
应用程序要查询某一条数据时首先会去缓存中查找,如果在缓存中找到相应的数据,则为缓存命中,将命中的数据直接从缓存中取出返回给应用程序,如果未命中则去数据库查询相应的数据,将数据库中的数据返回给应用程序,同时也会在缓存中保存数据以备下次查询。
在Hibernate中用到了两种缓存,分别是一级缓存和二级缓存,下面将分别介绍这两种缓存的基本内容,本次介绍的案例涉及到一张员工表employee,表中有两个字段empid和empname,我们预先在表中保存两条数据。
二、一级缓存
首先我们来看下面这个例子。
@Test
public void testCache() {
Session session = getSession();
Employee emp = session.get(Employee.class, 1);
System.out.println(emp.getEmpname());
emp = session.get(Employee.class, 1);
System.out.println(emp.getEmpname());
}
我们使用JUnit来进行测试,其中getSession()方法是一个获取Session对象的工具方法,在这个例子中我们首先获取Session,然后查询empid为1的对象,接着再做一次查询,仍然查询empid为1的对象,我们运行测试方法,查看控制台的输出。
Hibernate: select employee0_.empid as empid1_0_0_, employee0_.empname as empname2_0_0_ from employee employee0_ where employee0_.empid=?
张三
张三
可以看到控制台只打印了一次查询的SQL,这说明用Session第一次查询到empid为1的对象之后这个对象被缓存起来了,第二次查询的时候直接从缓存中获取相应的对象,而不是再查一次数据库。这个例子表明Hibernate的缓存是与Session有关的。
我们修改上面的例子再来看一下。
@Test
public void testCache() {
Session session = getSession();
Employee emp = session.get(Employee.class, 1);
System.out.println(emp.g