首页 > 其他分享 >【hibernate框架】缓存机制之二级缓存

【hibernate框架】缓存机制之二级缓存

时间:2023-03-19 12:02:59浏览次数:40  
标签:Category 缓存 cache 二级缓存 hibernate org id


二级缓存是sessionFactory级别的缓存,可以跨越session存在。

hibernate文档里关于二级缓存的说明:
二级缓存(The Second Level Cache)
hibernate支持多种多样的二级缓存的实现,但hibernate本身并没有写二级缓存的实现(有一个是用来内部测试的,不要用于产品开发),而是由其他的厂商来提供。

表 21.1. 缓存策略提供商(Cache Providers)
org.hibernate.cache.HashtableCacheProvider(内存)
org.hibernate.cache.EhCacheProvider(内存,硬盘)
org.hibernate.cache.OSCacheProvider(内存,硬盘)
org.hibernate.cache.SwarmCacheProvider(能用于集群环境)
org.hibernate.cache.TreeCacheProvider(能用于集群环境)
org.hibernate.cache.jbc.JBossCacheRegionFactory(能用于集群环境)

下面我们用EhCacheProvider做实验。
这是我们以前在hibernate.cfg.xml中关于缓存的配置:

<property name="cache.provider_class">
org.hibernate.cache.NoCacheProvider
</property>


如果想要使用其他厂商提供的缓存,就要在上面做好配置:


这里我们使用EhCacheProvider这个二级缓存


<property name="cache.use_second_level_cache">
true
</property>
<property name="cache.provider_class">
org.hibernate.cache.EhCacheProvider
</property>


EhCacheProvider自己也有一个配置文件:(这个配置文件在hibernate包下的project/etc/ehcache.xml)



<ehcache>
<diskStore path="java.io.tmpdir"/>

<!--默认cache的配置-->
<defaultCache
maxElementsInMemory="10000"<!--在缓存里最多多少个对象-->
eternal="false"<!--是否从来不把内存的对象清除-->
timeToIdleSeconds="12"<!--12秒没人来查这个缓存就将这个对象清除-->
timeToLiveSeconds="120"<!--某个对象呆了120秒缓存就将这个对象清除-->
overflowToDisk="true"<!--溢出的时候是否放到硬盘-->
/>

<cache name="sampleCache1"<!--缓存名字,可以想用哪一个缓存就用哪一个-->
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="300"
timeToLiveSeconds="600"
overflowToDisk="true"
/>

<cache name="sampleCache2"
maxElementsInMemory="1000"
eternal="true"
timeToIdleSeconds="0"
timeToLiveSeconds="0"
overflowToDisk="false"
/>

</ehcache>


讲二级缓存是为了应付面试的,工作中,除非必要,一般是不用二级缓存的。


有必要用二级缓存的场景:


1.经常被访问的


2.改动不大,不会经常被改动


3.数量有限



二级缓存的使用,利用注解(不是jpa的注解,是hibernate的)


@Cache(
(1)CacheConcurrencyStrategy usage();
(2)String region() default "";
(3)String include() default "all";
)

例如:


@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)

NONSTRICT_READ_WRITE说的是非严格读写


READ_ONLY是只读(在二级缓存里不允许改)


READ_WRITE是既能读又能改



region()是对应的缓存策略名称,不填就默认使用default 



使用的时候别忘了引入ehcache的jar包:ehcache-1.5.0.jar



加入ehcache的配置文件ehcache.xml之后,在category类上加注解:


package com.bjsxt.hibernate;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

import org.hibernate.annotations.BatchSize;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;

@Entity
@Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
public class Category {
private int id;
private String name;
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}


之后进行测试:


@Test
public void testHuanCun2(){
Session session = sf.openSession();
session.beginTransaction();
Category c=(Category)session.load(Category.class,1);
System.out.println(c.getName());
session.getTransaction().commit();
session.close();

Session session2 = sf.openSession();
session2.beginTransaction();
Category c2=(Category)session2.load(Category.class,1);
System.out.println(c2.getName());
session2.getTransaction().commit();
session2.close();
}


测试结果:


Hibernate: 


    select


        category0_.id as id0_0_,


        category0_.name as name0_0_ 


    from


        Category category0_ 


    where


        category0_.id=?


c0


c0


发现第二次去缓存中去取了


标签:Category,缓存,cache,二级缓存,hibernate,org,id
From: https://blog.51cto.com/u_16012040/6131098

相关文章