博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【hibernate框架】缓存机制之二级缓存
阅读量:6690 次
发布时间:2019-06-25

本文共 2870 字,大约阅读时间需要 9 分钟。

二级缓存是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中关于缓存的配置:
org.hibernate.cache.NoCacheProvider
如果想要使用其他厂商提供的缓存,就要在上面做好配置:
这里我们使用EhCacheProvider这个二级缓存
true
org.hibernate.cache.EhCacheProvider
EhCacheProvider自己也有一个配置文件:(这个配置文件在hibernate包下的project/etc/ehcache.xml)
eternal="false"
timeToIdleSeconds="12"
timeToLiveSeconds="120"
overflowToDisk="true"
/>
maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="300" timeToLiveSeconds="600" overflowToDisk="true" />
讲二级缓存是为了应付面试的,工作中,除非必要,一般是不用二级缓存的。
有必要用二级缓存的场景:
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

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

转载请注明出处:

你可能感兴趣的文章
如何做好一名售前工程师 [理论]
查看>>
什么是语法糖?
查看>>
rabbitMQ的安装和创建用户
查看>>
Struts2笔记——第一个实例HelloWorld
查看>>
Maven安装
查看>>
2.1列表相关知识点
查看>>
OpenStack images
查看>>
xsigo systems
查看>>
ofbiz ins
查看>>
iOS动画实现改变frme和contenOffset
查看>>
DroidPilot使用第一步 - 安装
查看>>
vue-cli —— 项目打包及一些注意事项
查看>>
1.1 变量
查看>>
mfc 链接时错误 文件函数重复定义
查看>>
php
查看>>
Django 是如何实现用户登录和登出机制的(默认版本-数据库版本)
查看>>
【转】 wpf系列-入门
查看>>
exp6
查看>>
PBRT笔记(12)——蒙特卡洛积分
查看>>
自己用 python 实现 base64 编码
查看>>