Hibernate一级缓存

来源:互联网 发布:win7电脑桌面美化软件 编辑:程序博客网 时间:2024/05/17 21:40

1.什么是缓存?

  • 不是指计算机中的cache缓存空间,在Hibernate中是指为了降低应用程序访问对数据库的访问次数,目的是提高应用程序获取数据的效率。

    2.为什么使用缓存?

  • Hibernate框架访问数据库的效率直接影响应用程序的运行速度,因此优化Hibernate框架的执行效率对应用程序非常重要。

  • 使用Hibernate缓存机制可以让程序更快的获取数据。

    3.缓存的工作原理

  • 将数据库中的一些数据copy到缓存中去,第二次获取数据时, 如果有缓存中有想要的数据直接取数据就是,无须使用 select语句从数据库中获取。如果缓存中没有想要的数据,Hibernate发出一条select语句从数据库中获取数据。

4.实例代码演示

package cn.codeWang.entity;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;@Entity(name="person")public class Person {    @Id    @GeneratedValue    private int id;    private String name;    private String sex;    private String department;    public Person(){    }    public Person(String name, String sex, String department) {        super();        this.name = name;        this.sex = sex;        this.department = department;    }    public String getName() {        return name;    }    public String getSex() {        return sex;    }    public String getDepartment() {        return department;    }}

情况一:使用同一个session获取同一个对象

 @Test        public void testOneCache1(){            Person p=session.get(Person.class, 2);            System.out.println("姓名="+p.getName());            Person p1=session.get(Person.class, 2);            System.out.println("姓名="+p1.getName());        }控制台输出结果:Hibernate:     alter table Employee        add constraint FK14tijxqry9ml17nk86sqfp561        foreign key (department_id)        references Department (id)Hibernate:     select        person0_.id as id1_2_0_,        person0_.department as departme2_2_0_,        person0_.name as name3_2_0_,        person0_.sex as sex4_2_0_     from        person person0_     where        person0_.id=?姓名=凯耐姓名=凯耐总结:一个session对象第一次获得person对象,会将其放在缓存区域,第二次获得同一个对象时,直接从缓存中获取person对象即可。

情况二:使用不同session对象获取同一对象

@Test        public void testOneCache1(){            Person p=session.get(Person.class, 2);            System.out.println("姓名="+p.getName());            //第二次获得session对象            session = sessionFactory.openSession();            p=session.get(Person.class, 2);            System.out.println("姓名="+p.getName());        }控制台输出结果:Hibernate:     select        person0_.id as id1_2_0_,        person0_.department as departme2_2_0_,        person0_.name as name3_2_0_,        person0_.sex as sex4_2_0_     from        person person0_     where        person0_.id=?姓名=凯耐Hibernate:     select        person0_.id as id1_2_0_,        person0_.department as departme2_2_0_,        person0_.name as name3_2_0_,        person0_.sex as sex4_2_0_     from        person person0_     where        person0_.id=?姓名=凯耐总结:使用不同session对象获取同一对象,需要对数据库进行两次select操作。因此缓存与session相关。

5.Hibernate一级缓存的API
一级缓存无法取消,使用两个方法管理。

  • evict():将某个指定对象从session的一级缓存中清除。
  • clear():清除一级缓存中的所有对象

6.session执行多次list()方法

        @Test        public void testOneCache1(){         Query query=session.createQuery("from person");         List<Person> list=query.list();         for(Person p:list){             System.out.println(p.getName());         }           list=query.list();         for(Person p:list){             System.out.println(p.getName());         }        }控制台输出结果:Hibernate:     select        person0_.id as id1_2_,        person0_.department as departme2_2_,        person0_.name as name3_2_,        person0_.sex as sex4_2_     from        person person0_凯耐凯丽欧陆Hibernate:     select        person0_.id as id1_2_,        person0_.department as departme2_2_,        person0_.name as name3_2_,        person0_.sex as sex4_2_     from        person person0_凯耐凯丽欧陆总结:同一个session执行两个相同的list()查询,list()方法不支持从缓存中获取数据,第二次查询仍然需要发出select语句去操作数据库。
  1. iterator()方法的查询使用
    }             @Test        public void testOneCache1(){         Query query=session.createQuery("from person");         List<Person> list=query.list();         for(Person p:list){             System.out.println(p.getName());         }         Iterator it=query.iterate();         while(it.hasNext()){             Person p=(Person) it.next();             System.out.println(p.getName());         }    }控制台输出结果:Hibernate:     select        person0_.id as id1_2_,        person0_.department as departme2_2_,        person0_.name as name3_2_,        person0_.sex as sex4_2_     from        person person0_凯耐凯丽欧陆Hibernate:     select        person0_.id as col_0_0_     from        person person0_凯耐凯丽欧陆@Test        public void testOneCache1(){         Query query=session.createQuery("from person");         Iterator it=query.iterate();         while(it.hasNext()){             Person p=(Person) it.next();             System.out.println(p.getName());         }    }控制台输出结果:Hibernate:     select        person0_.id as id1_2_0_,        person0_.department as departme2_2_0_,        person0_.name as name3_2_0_,        person0_.sex as sex4_2_0_     from        person person0_     where        person0_.id=?凯耐Hibernate:     select        person0_.id as id1_2_0_,        person0_.department as departme2_2_0_,        person0_.name as name3_2_0_,        person0_.sex as sex4_2_0_     from        person person0_     where        person0_.id=?凯丽Hibernate:     select        person0_.id as id1_2_0_,        person0_.department as departme2_2_0_,        person0_.name as name3_2_0_,        person0_.sex as sex4_2_0_     from        person person0_     where        person0_.id=?欧陆总结:iterator()方法支持一级缓存。
原创粉丝点击