【Hibernate】一级、二级缓冲
Hibernate缓冲按级别共分为两种,一级缓冲(Session)和二级缓冲(SessionFactory),有的也说是三种,还有一种是查询缓冲,当然,查询缓冲是依托于二级缓冲。
ok,什么是缓冲?
在内存里开辟一块空间把本来应该存在硬盘里面的数据,存在这个空间里面,将来,需要这块数据的时候直接在内存中获取。这个就可以简单理解为缓冲。
一级缓冲
什么是一级缓冲,一级缓冲是Hibernate默认的,,不用管它。
比如下面这段代码,
@TestpublicvoidfindTestyijihuanchong(){Sessions=sessionFactory.openSession();s.beginTransaction();Personperson=(Person)s.load(Person.class,1);System.out.println(person.getName());//因为Session存在缓冲,所以这个查询直接在session中取Personperson2=(Person)s.load(Person.class,1);System.out.println(person2.getName());s.getTransaction().commit();}
比如下面这段代码,显然发出的是两条SQL语句。
@TestpublicvoidfindTestyijihuanchong(){Sessions=sessionFactory.openSession();s.beginTransaction();Personperson=(Person)s.load(Person.class,1);System.out.println(person.getName());s.getTransaction().commit();s.close();Sessions2=sessionFactory.openSession();s2.beginTransaction();Personperson2=(Person)s2.load(Person.class,1);System.out.println(person2.getName());s2.getTransaction().commit();s2.close();}
<!–开启缓冲–><propertyname=”hibernate.cache.use_second_level_cache”>true</property><!–指定是哪个二级缓冲–><propertyname=”hibernate.cache.provider_class”>org.hibernate.cache.EhCacheProvider</property><!–使用查询二级缓冲–><propertyname=”hibernate.cache.use_query_cache”>true</property>
第二步,我们指定是哪个实体类需要二级缓冲
Annotations配置
@Entity@Cache(usage=CacheConcurrencyStrategy.READ_WRITE)@Table(name=”p_person”)
XML配置
<classname=”Person”table=”t_person”><cacheusage=”read-write”/><idname=”id”>
记住XML配置一定是id之前,class之内
配置完之后,我们直接看
@TestpublicvoidfindTesterjihuanchong(){Sessions=sessionFactory.openSession();s.beginTransaction();Personperson=(Person)s.load(Person.class,1);System.out.println(person.getName());s.getTransaction().commit();s.close();Sessions2=sessionFactory.openSession();s2.beginTransaction();Personperson2=(Person)s2.load(Person.class,1);System.out.println(person2.getName());s2.getTransaction().commit();s2.close();}
setCacheable(true)
ok,看代码
@TestpublicvoidfindTestList(){Sessions=sessionFactory.getCurrentSession();s.beginTransaction();List<Person>persons=s.createQuery(“fromPerson”).setCacheable(true).list();List<Person>person1=s.createQuery(“fromPerson”).setCacheable(true).list();for(Personperson:persons){System.out.println(person.getName()+”—-“+person.getId());}for(Personperson:person1){System.out.println(person.getName()+”—-“+person.getId());}s.getTransaction().commit();}
勇敢的冷静的理智的去接受失败,有时不但是必要的,而且是很有必要的。