当前位置: 首页 > news >正文

具体解释Hibernate中的二级缓存

  

 1.前言

这篇博客再前几篇博客的基础上来解说一下。Hibernate中的二级缓存。二级缓存是属于SessionFactory级别的缓存机制。

第一级别的缓存是Session级别的缓存,是属于事务范围的缓存,由Hibernate管理,一般无需进行干预。第二级别的缓存是SessionFactory级别的缓存。是属于进程范围的缓存。


 2.Hibernate二级缓存

1.分类

二级缓存也分为了两种

内置缓存:Hibernate自带的,不可卸载,通常在Hibernate的初始化阶段,Hibernate会把映射元数据和提前定义的SQL语句放置到SessionFactory的缓存中。该内置缓存是仅仅读的。

外置缓存:通常说的二级缓存也就是外置缓存,在默认情况下SessionFactory不会启用这个缓存插件,外置缓存中的数据是数据库数据的复制,外置缓存的物理介质能够是内存或者硬盘。

hibernate二级缓存的结构





2.并发訪问策略

transactional

(事务型)

仅在受管理的环境中适用

提供Repeatable Read事务隔离级别

适用常常被读。非常少改动的数据

能够防止脏读和不可反复读的并发问题

缓存支持事务,发生异常的时候。缓存也可以回滚

read-write

(读写型)

提供Read Committed事务隔离级别

在非集群的环境中适用

适用常常被读,非常少改动的数据

能够防止脏读

更新缓存的时候会锁定缓存中的数据

nonstrict-read-write

(非严格读写型)

适用极少被改动,偶尔同意脏读的数据(两个事务同一时候改动数据的情况非常少见)

不保证缓存和数据库中数据的一致性

为缓存数据设置非常短的过期时间,从而尽量避免脏读

不锁定缓存中的数据

read-only

(仅仅读型)

适用从来不会被改动的数据(如參考数据)

在此模式下,假设对数据进行更新操作,会有异常

事务隔离级别低,并发性能高

在集群环境中也能完美运作


分析:通过上述表格分析例如以下

适合放入二级缓存中数据

非常少被改动

不是非常重要的数据。同意出现偶尔的并发问题

不适合放入二级缓存中的数据

常常被改动

財务数据,绝对不同意出现并发问题

与其它应用数据共享的数据


 3.二级缓存的配置

1.hibernate支持的缓存插件

EHCache: 可作为进程范围内的缓存,存放数据的物理介质能够是内存或硬盘,对Hibernate的查询缓存提供了支持

OpenSymphony`:可作为进程范围内的缓存,存放数据的物理介质能够是内存或硬盘,提供了丰富的缓存数据过期策略,对Hibernate的查询缓存提供了支持

SwarmCache:可作为集群范围内的缓存,但不支持Hibernate的查询缓存

JBossCache:可作为集群范围内的缓存,支持Hibernate的查询缓存


四种缓存插件支持的并发范围策略例如以下图




2.二级缓存配置

以下以ehcache缓存为例,来讲一下二级缓存的配置

2.1 拷贝jar包

如要第三方的jar包ehcache-1.5.0.jar,而且依赖于

依赖backport-util-concurrent 和 commons-logging

2.2 在hibernate.cfg.xml中开启二级缓存

<propertyname="hibernate.cache.use_second_level_cache">true</property>

2.3 配置二级缓存技术提供商

<propertyname="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>

2.4 配置缓存数据对象并发策略

方式一 在hbm文件里配置

<span style="font-family:SimSun;font-size:18px;"><class name="cn.itcast.domain.Customer" table="customers" catalog="hibernate3day4" >
				<!-- 类级别缓存 -->
				<cache usage="read-write"/>
				<set name="orders" cascade="all-delete-orphan" inverse="true" >
					<!-- 关联集合级别缓存 -->
					<cache usage="read-write"/>	
				</set>
			</class>
</span>


方式二 在cfg文件配置(集中配置)


<span style="font-family:SimSun;font-size:18px;"><!-- 类级别缓存 -->
			<class-cache usage="read-write" class="cn.itcast.domain.Customer"/>
			<class-cache usage="read-write" class="cn.itcast.domain.Order"/>
			<!-- 集合缓存 -->
			<collection-cache usage="read-write" collection="cn.itcast.domain.Customer.orders"/>
</span>

2.5 加入二级缓存配置文件

在src中配置ehcache.xml,将ehcache.jar包中的ehcache-failsafe.xml 改名 ehcache.xml 放入 src 

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">

    <diskStore path="java.io.tmpdir"/> 配置二级缓存硬盘暂时文件夹位置 
		 <defaultCache  
            maxElementsInMemory="10000" // 内存中最大对象数量 ,超过数量。数据会被缓存到硬盘 
            eternal="false"
            timeToIdleSeconds="120" // 是否缓存为永久性 false 不永久
            timeToLiveSeconds="120" // 存活时间。对象无论是否使用,到了时间回收
            overflowToDisk="true" // 能否够缓存到硬盘
            maxElementsOnDisk="10000000" // 硬盘缓存最大对象数量 
            // 当jvm结束时是否持久化对象 true false 默认是false
            diskExpiryThreadIntervalSeconds="120"  // 指定专门用于清除过期对象的监听线程的轮询时间 
            memoryStoreEvictionPolicy="LRU" 

            />

</ehcache>



 4.Demo測试二级缓存

@Test
	public void fun1() {

		Session s1 = HibernateUtils.getSession();
		s1.beginTransaction();
		Customer c1 = (Customer) s1.get(Customer.class, 1); // 从数据库中载入数据
		System.out.println(c1.getName());//此时才会发出SQL语句
		s1.getTransaction().commit();
		s1.close(); // 关闭session级别的一级缓存

		Session s2 = HibernateUtils.getSession();
		s2.beginTransaction();
		Customer c2 = (Customer) s2.get(Customer.class, 1); // 由于有了二级缓存的存在,直接从二级缓存中取出就可以
		System.out.println(c2.getName());

		Customer c3 = (Customer) s2.get(Customer.class, 1); //从二级缓存中取出
		System.out.println(c3.getName());

		s2.getTransaction().commit();
		s2.close();

	}



相关文章:

  • JavaScript学习系列(一)什么是javascript
  • 移动端唤起键盘时取消position:fixed定位
  • 磁盘爆满
  • 29、Java并发性和多线程-非阻塞算法
  • 吕佳(帮别人名字作诗)
  • 如何弹出固定大小及内容的网页窗口
  • jvm 各个区含义
  • 文章推荐
  • Spark HA on yarn 最简易安装。
  • jade 入门教程
  • SICP-1.5-控制结构
  • C++面试题集(最全的C\C++试题集和答案)
  • java多态的理解
  • [导入]创建一个存储过程,根据系部编号查出男生、女生人数
  • 安装OpenResty开发环境
  • 【译】JS基础算法脚本:字符串结尾
  • hexo+github搭建个人博客
  • bearychat的java client
  • HTTP 简介
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • js数组之filter
  • npx命令介绍
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • oschina
  • rabbitmq延迟消息示例
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • Web标准制定过程
  • 百度小程序遇到的问题
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 基于HAProxy的高性能缓存服务器nuster
  • 记一次用 NodeJs 实现模拟登录的思路
  • 浅谈web中前端模板引擎的使用
  • #define、const、typedef的差别
  • #pragma data_seg 共享数据区(转)
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (LeetCode 49)Anagrams
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (转)母版页和相对路径
  • (转)使用VMware vSphere标准交换机设置网络连接
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .Net CoreRabbitMQ消息存储可靠机制
  • .NET 表达式计算:Expression Evaluator
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • .NET开源项目介绍及资源推荐:数据持久层
  • .net通用权限框架B/S (三)--MODEL层(2)
  • :“Failed to access IIS metabase”解决方法
  • @Autowired自动装配
  • @RunWith注解作用
  • @Tag和@Operation标签失效问题。SpringDoc 2.2.0(OpenApi 3)和Spring Boot 3.1.1集成