hibernate之关于Hibernate的一级、二级缓冲

【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();}

勇敢的冷静的理智的去接受失败,有时不但是必要的,而且是很有必要的。

hibernate之关于Hibernate的一级、二级缓冲

相关文章:

你感兴趣的文章:

标签云: