当前位置 : 主页 > 编程语言 > java >

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

来源:互联网 收集:自由互联 发布时间:2023-03-22
二级缓存是sessionFactory级别的缓存,可以跨越session存在。 hibernate文档里关于二级缓存的说明: 二级缓存(The Second Level Cache) hibernate支持多种多样的二级缓存的实现,但hibernate本身并没有

二级缓存是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; }}

之后进行测试:

@Testpublic 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

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

上一篇:redis缓存-概念
下一篇:没有了
网友评论