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

之后进行测试:
@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

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


转载请注明出处:http://blog.csdn.net/acmman/article/details/44132207

相关文章
|
3月前
|
存储 缓存 前端开发
HTTP的缓存机制是什么?
HTTP的缓存机制是什么?
28 1
|
4月前
|
SQL 缓存 Java
如何判断mybatis 开启二级缓存 和二级缓存详细讲解
如何判断mybatis 开启二级缓存 和二级缓存详细讲解
50 0
|
3月前
|
存储 消息中间件 缓存
redis的缓存机制
redis的缓存机制
91 0
|
1月前
|
存储 缓存 算法
深入探究LRU缓存机制:优化内存利用与提升性能
深入探究LRU缓存机制:优化内存利用与提升性能
114 1
|
1月前
|
存储 缓存 Java
什么!?实战项目竟然撞到阿里面试的原题!???关于MyBatis Plus的缓存机制
什么!?实战项目竟然撞到阿里面试的原题!???关于MyBatis Plus的缓存机制
|
3月前
|
Shell Unix Linux
Linux 终端命令之文件浏览(3) less
Linux 终端命令之文件浏览(3) less
30 0
Linux 终端命令之文件浏览(3) less
|
3月前
|
Java Go C++
Java每日一练(20230427) 螺旋矩阵、LRU缓存机制、解数独
Java每日一练(20230427) 螺旋矩阵、LRU缓存机制、解数独
26 0
Java每日一练(20230427) 螺旋矩阵、LRU缓存机制、解数独
|
3月前
|
Python 缓存 机器学习/深度学习
Python每日一练(20230331) 阶乘后的零、无重复最长子串、LRU缓存机制
Python每日一练(20230331) 阶乘后的零、无重复最长子串、LRU缓存机制
33 0
Python每日一练(20230331) 阶乘后的零、无重复最长子串、LRU缓存机制
|
3月前
|
缓存 关系型数据库 MySQL
MySQL高效运行的秘密:BufferPool缓存机制深度剖析!
MySQL高效运行的秘密:BufferPool缓存机制深度剖析!
MySQL高效运行的秘密:BufferPool缓存机制深度剖析!
|
4月前
|
缓存 Java Maven
Spring Cache框架,实现了基于注解的缓存功能。
Spring Cache框架,实现了基于注解的缓存功能。
33 0