Hibernate第十二篇【二级缓存介绍、缓存策略、查询缓存、集合缓存】

Hibernate二级缓存介绍

前面我们已经讲解过了一级缓存,一级缓存也就是Session缓存,只在Session的范围内有效…作用时间就在Session的作用域中,范围比较小

Hibernate为我们提供了二级缓存功能:二级缓存是基于应用程序的缓存,所有的Session都可以使用

  • Hibernate提供的二级缓存有默认的实现,且是一种可插配的缓存框架!如果用户想用二级缓存,只需要在hibernate.cfg.xml中配置即可; 不想用,直接移除,不影响代码。
  • 如果用户觉得hibernate提供的框架框架不好用,自己可以换其他的缓存框架或自己实现缓存框架都可以。

这里写图片描述

Hibernate二级缓存:存储的是常用的类


配置二级缓存

既然二级缓存是Hibernate自带的,那么我们可以在hibernate.properties文件中找到对应的信息..

这里写图片描述

  • #hibernate.cache.use_second_level_cache false【二级缓存默认不开启,需要手动开启】
  • #hibernate.cache.use_query_cache true 【开启查询缓存】
  • ## choose a cache implementation 【二级缓存框架的实现】
  • #hibernate.cache.provider_class org.hibernate.cache.EhCacheProvider
  • #hibernate.cache.provider_class org.hibernate.cache.EmptyCacheProvider
  • hibernate.cache.provider_class org.hibernate.cache.HashtableCacheProvider 默认实现
  • #hibernate.cache.provider_class org.hibernate.cache.TreeCacheProvider
  • #hibernate.cache.provider_class org.hibernate.cache.OSCacheProvider
  • #hibernate.cache.provider_class org.hibernate.cache.SwarmCacheProvider

通过配置文件我们可以发现,二级缓存默认是不开启的,需要我们手动开启,以下步骤:

  • 1)开启二级缓存
  • 2)指定缓存框架
  • 3)指定哪些类加入二级缓存

开启二级缓存

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


        <!-- a.  开启二级缓存 -->
        <property name="hibernate.cache.use_second_level_cache">true</property>

指定缓存框架

指定Hibernate自带的二级缓存框架就好了


        <!-- b. 指定使用哪一个缓存框架(默认提供的) -->
        <property name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property>

指定哪些类加入二级缓存


        <!-- c. 指定哪一些类,需要加入二级缓存 -->
        <class-cache usage="read-write" class="zhongfucheng.aa.Monkey"/>
        <class-cache usage="read-only" class="zhongfucheng.aa.Cat"/>

测试

我们知道一级缓存是Session的缓存,那么我们在测试二级缓存的时候使用两个Session来测试就好了。如果第二个Session拿到的是缓存数据,那么就证明二级缓存是有用的。


package zhongfucheng.aa;

import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;

public class App5 {
    public static void main(String[] args) {


        //获取加载配置管理类
        Configuration configuration = new Configuration();
        //加载类对应的映射文件!
        configuration.configure().addClass(Animal.class);
        //创建Session工厂对象
        SessionFactory factory = configuration.buildSessionFactory();
        //得到Session对象
        Session session1 = factory.openSession();
        //使用Hibernate操作数据库,都要开启事务,得到事务对象
        Transaction transaction = session1.getTransaction();
        //开启事务
        transaction.begin();
        Monkey monkey = (Monkey) session1.get(Monkey.class,"40283f815be67f42015be67f43240001" );
        System.out.println(monkey.getName());
        System.out.println("-----------------------");



        Session session2 = factory.openSession();
        Transaction transaction2 = session2.getTransaction();
        transaction2.begin();
        Monkey monkey2 = (Monkey) session1.get(Monkey.class, "40283f815be67f42015be67f43240001");
        System.out.println(monkey2.getName());


        //提交事务
        transaction.commit();
        transaction2.commit();

        //关闭Session
        session1.close();
        session2.close();


    }
}

得到的是缓存数据!

这里写图片描述


缓存策略

我们在把Animal类放进二级缓存的时候,用法为只读

这里写图片描述

也就是说,只能读取,不能写入,我们来看看写入会怎么样:


  monkey2.setName("小猴子");

抛出了异常….

这里写图片描述


usage的属性有4种:

  • 放入二级缓存的对象,只读;
  • 非严格的读写
  • 读写; 放入二级缓存的对象可以读、写;
  • (基于事务的策略)

集合缓存

如果我们在数据库查询的数据是集合…Hibernate默认是没有为集合数据设置二级缓存的…因此还是需要去读写数据库的信息

接下来,我们就看看把集合设置为二级缓存是什么做的:

  • 在hibernate.cgf.xml中配置对象中的集合为二级缓存
        <!-- 集合缓存[集合缓存的元素对象,也加加入二级缓存] -->
        <collection-cache usage="read-write" collection="cn.itcast.b_second_cache.Dept.emps"/>
  • 测试代码:

    public void testCache() {
        Session session1 = sf.openSession();
        session1.beginTransaction();
        // a. 查询一次
        Dept dept = (Dept) session1.get(Dept.class, 10);
        dept.getEmps().size();// 集合
        session1.getTransaction().commit();
        session1.close();

        System.out.println("------");

        // 第二个session
        Session session2 = sf.openSession();
        session2.beginTransaction();
        // a. 查询一次
        dept = (Dept) session2.get(Dept.class, 10);  // 二级缓存配置好; 这里不查询数据库
        dept.getEmps().size();

        session2.getTransaction().commit();
        session2.close();
    }

查询缓存

list()和iterator()会把数据放在一级缓存,但一级缓存只在Session的作用域中有效…如果想要跨Session来使用,就要设置查询缓存

我们在配置文件中还看到了查询缓存这么一条配置..

    #hibernate.cache.use_query_cache true      【开启查询缓存】

也就是说,默认的查询数据是不放在二级缓存中的,如果我们想要把查询出来的数据放到二级缓存,就需要在配置文件中开启

        <!-- 开启查询缓存 -->
        <property name="hibernate.cache.use_query_cache">true</property>
  • 在使用程序查询的时候,也要调用setCacheable()方法,设置为查询缓存。

    @Test
    public void listCache() {
        Session session1 = sf.openSession();
        session1.beginTransaction();
        // HQL查询  【setCacheable  指定从二级缓存找,或者是放入二级缓存】
        Query q = session1.createQuery("from Dept").setCacheable(true);
        System.out.println(q.list());
        session1.getTransaction().commit();
        session1.close();


        Session session2 = sf.openSession();
        session2.beginTransaction();
        q = session2.createQuery("from Dept").setCacheable(true);
        System.out.println(q.list());  // 不查询数据库: 需要开启查询缓存
        session2.getTransaction().commit();
        session2.close();
    }

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
汽车IVI中控开发入门及进阶(三十八):手机投屏HiCar开发 为了兼容这部分手机,车机端在向手机端发送USB控制命令字的同时,需要启动mDNS Server,广播车机端IP地址和HiCar SDK侦听的Server Socket端口(IP地址和端口在HiCar SDK初始化USB driver时,告知车机),在检测到手机断开USB连接时关闭mDNS Server。厂商在集成HiCar SDK开发HMI应用时,不可避免会使用到智能座舱的敏感权限,例如位置权限、摄像头权限、麦克风权限等,SDK初始化时,厂商HMI应用需要设置必要的车机参数供SDK使用。 阅读详情

相关推荐

使用基于物质点法(MPM)的Anura3D模拟沙柱坍塌

本博客使用开源软件Anura3D软件模拟了一个沙柱坍塌的过程,这个软件是基于基于物质点法(MPM)设计的

weixin_59902634的博客 4043

hibernate.cache.use_query_cache 认识误区

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33800463的博客 1549

可微编程:当深度学习遇见物理定律,重塑科学计算新范式

本文探讨了可微编程如何将深度学习与物理定律相结合,重塑科学计算范式。通过自动微分技术,它将物理方程融入可微计算图,使模型在数据驱动的同时遵守物理约束。文章以神经常微分方程为例,阐述了其在连续系统建模、科学模拟器优化等领域的应用,并分析了当前面临的挑战与最佳实践路径。

weixin_29056145的博客 134

Hibernate中的Query cache(查询缓存)

对于经常用到的查询语句,如果其中的查询参数是固定的,则可以将这样的查询结果也存储到Hibernate的二级缓存中。 应用中设置了查询缓存后,查询的结果集将被存储到缓存中,但并非缓存结果集中具体的entity对象,而是只缓存entity对象的标识符。另外,查询缓存往往代价很大,如果缓存的查询不当,性能有很大影响。 1. 开启查询缓存的步骤: 1).配置文件中,设置配置参数hibernate

成长的足迹 8094

SAP ABAP CDS View 里的日期函数

摘要:本文系统介绍了ABAP CDS日期函数在企业级应用中的关键作用,包括账龄计算、合同续期等业务场景。重点解析了DATS_IS_VALID、DATS_DAYS_BETWEEN等核心函数的语义和使用边界,特别强调on_error四种异常处理策略的选择逻辑。针对系统日期获取,对比了经典CDS的参数注入和View Entity会话变量两种方式。文章还提供了完整可运行的示例代码(包含CDS视图和ABAP程序),帮助开发者快速验证不同版本下的函数行为差异,确保在实际项目中正确应用这些日期处理函数。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 379

别再盯着那 100 条数据了,RAP OData 分页机制到底在保护什么

摘要: SAP BTP ABAP Environment 的 OData 服务默认采用分页保护机制,未指定 $top 时仅返回100条数据并附带下一页链接。这种设计旨在防止资源滥用,而非服务故障。客户端应遵循OData协议规范,直接使用服务端返回的 next link 进行分页请求,而非自行构造URL。当指定 $top 参数时,若数值超过5000仍会被强制分页。该机制在SAPUI5控件中被自动处理,但自定义客户端需主动实现分页逻辑。对于自定义实体(Custom Entity),开发者需在Query Prov

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 861

JPQL-Query查询实例详解

前面学习了JPQL语言和Query接口。这里学习一下如果通过JPQL和Query接口进行数据的查询、更新和删除。【1】普通查询首先说明一下FROM子句和Select-FROM。from 子句是查询语句的必选子句。Select 用来指定查询返回的结果实体或实体的某些属性。From 子句声明查询源实体类,并指定标识符变量(相当于SQL表的别名)。如果不希望返回重复实体,可使用关键字 distinct 修

小小默:进无止境 1万+

【自然语言处理】情感分析(一):基于 NLTK 的 Naive Bayes 实现

朴素贝叶斯(Naive Bayes)分类器可以用来确定输入文本属于某一组类别的概率。例如,预测评论是正面的还是负面的。它是 “朴素的”,它假设文本中的单词是独立的(但在现实的自然人类语言中,单词的顺序传达了上下文信息)。尽管有这些假设,但朴素贝叶斯在使用少量训练集预测类别时具有很高的准确性。

Data · Model · Agent · Repeat 2173

Hibernate4之二级缓存配置

缓存:缓存是什么,解决什么问题?  位于速度相差较大的两种硬件/软件之间的,用于协调两者数据传输速度差异的结构,均可称之为缓存Cache。缓存目的:让数据更接近于应用程序,协调速度不匹配,使访问速度更快。  缓存的范围分为3类:  1.事务范围(单Session即一级缓存)     事务范围的缓存只能被当前事务访问,每个事务都有各自的缓存,缓存内的数据通常采用相互关联的对象形式.缓存的

runming56的专栏 4万+

华为OD机试 - 猴子吃桃 - 二分查找(Java 新系统 100分)

每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天优快云在线答疑。

学Java,找哪吒 3850

HTML爱心字母雨(完整代码)

HTML语言实现爱心字母雨的完整代码。

AIGC 2万+

【Hibernate】二级缓存(Hibernate默认使用的二级缓存)

一、Hibernate提供的缓存 有一级缓存、二级缓存。 目的是为了减少对数据库的访问次数,提升程序执行效率!   二、一级缓存 基于Session的缓存,缓存内容只在当前session有效,session关闭,缓存内容失效! 特点: 作用范围较小! 缓存的事件短。 缓存效果不明显。   三、二级缓存 Hibernate提供了基于应用程序级别的缓存, 可以跨多个session

LFSenior 7026

AMD KFD的SDMA Packet 类型和定义解析

本文详细分析了AMD GPU架构中的SDMA(System Direct Memory Access)数据传输机制,重点介绍了其核心数据结构——SDMA Packet。SDMA通过8种主要Packet类型(包括内存拷贝、数据写入、屏障同步、中断触发等)实现高效主机-设备通信。每种Packet采用位域结构和联合体封装设计,在保证功能完整性的同时实现空间优化。这些Packet支持丰富的访问属性和扩展字段,适用于高性能数据搬运、内存初始化、任务同步、性能分析等场景,为GPU计算提供了灵活高效的数据传输解决方案。

图形/计算GPU的驱动与虚拟化技术分享园地 1254

Hibernate一级缓存和二级缓存详解

一、一级缓存二级缓存的概念解释 (1)一级缓存就是Session级别的缓存,一个Session做了一个查询操作,它会把这个操作的结果放在一级缓存中,如果短时间内这个 session(一定要同一个session)又做了同一个操作,那么hibernate直接从一级缓存中拿,而不会再去连数据库,取数据。 (2)二级缓存就是SessionFactory级别的缓存,顾名思义,就是查询的时候会把查询结果

徐刘根的博客 2万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Hibernate注解方式的二级缓存

hibernate默认情况下是支持一级缓存,也就是session级的缓存的,而默认情况下是不支持二级缓存,即sessionFactory级的缓存的,二级缓存        一般比较少去考虑它,除非对效率要求非常高的时候, 这时侯如果我们的某一个实体要在多个session里面使用需要用到session间的缓存的时候就可以进行配置来实现二级缓存了! 在看文档的时候说可以在persistence

Elim的博客 1万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Hibernate(14)什么是Hibernate的二级缓存?

Hibernate二级缓存是跨Session的共享缓存机制,可减少数据库访问提升性能。主要特点包括:Session工厂范围内共享数据、需显式配置缓存提供者(如Ehcache)和策略、支持缓存实体/集合/查询结果。配置步骤包括:1)在hibernate.cfg.xml中启用二级缓存并指定提供者;2)配置ehcache.xml定义缓存参数;3)使用@Cache注解标记需要缓存的实体类。示例演示了如何通过不同Session访问同一数据时,二级缓存可避免重复查询数据库。该技术特别适用于不常修改的共享数据场景,能显著

qq_43012298的博客 1344

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Hibernate:二级缓存

缓存(Cache):计算机领域非常通用的概念。它介于应用程序和永久性数据存储源(如硬盘上的文件或者数据库)之间,其作用是降低应用程序直接读写永久性数据存储源的频率,从而提高应用的运行性能。缓存中的数据是数据存储源中数据的拷贝。缓存的物理介质通常是内存。 Hibernate中提供了两个级别的缓存: 第一级别的缓存是 Session 级别的缓存,它是属于事务范围的缓存。这一级别的缓存由 hibernate 管理的。 第二级别的缓存是 SessionFactory 级别的缓存,它是属于进程范围的缓存。 .

燕双嘤 2700

hibernate 二级缓存

Hibernate 缓存 缓存(Cache): 计算机领域非常通用的概念。它介于应用程序和永久性数据存储源(如硬盘上的文件或者数据库)之间,其作用是降低应用程序直接读写永久性数据存储源的频率,从而提高应用的运行性能。缓存中的数据是数据存储源中数据的拷贝。缓存的物理介质通常是内存 Hibernate中提供了两个级别的缓存

Code-lover's Learning Notes 1832

【Java】Hibernate二级缓存下

文章摘要:本文详细介绍了EHCACHE二级缓存的配置与使用,重点解析了集合级别缓存的配置参数,包括磁盘存储位置、内存/磁盘缓存限制、缓存失效时间等核心属性。同时阐述了三种缓存清空策略(FIFO、LFU、LRU)的差异,并说明了查询缓存对二级缓存的依赖关系。最后解释了时间戳缓存的机制,即通过记录数据表变更时间戳来判断缓存结果集是否过期,决定是否重新执行SQL查询。全文系统地介绍了EHCACHE缓存的配置要点和运行原理。

学习笔记,人工智能,教程,技术分享! 949

Hibernate二级缓存设置

Hibernate二级缓存设置 二级缓存是SessionFactory层面的缓存并被所有的Session共享,故不像一级缓存Session一样需要调用flush进行清理(没有临时集合),但使用二级缓存必须配置外置的二级缓存插件,常见的二级缓存插件有 Ehcache OSCache JBoss Cache Infininspan 以常用的Ehcache为例(Hibernate版本5.5) 二级缓存的并发访问策略 1.准备相关的jar包,配置 net.sf.ehcache

jamenu的博客 764

Hibernate缓存及查询策略研究

公司现在有一个比较旧的SSH项目,使用hibernate作为数据访问层框架。因为表之间的关系比较复杂,所以在类与类之间配置了很多的一对多,多对多关联关系,在查数据的时候会查出很多不需要的数据,导致了查询性能的低下,一次简单的分页查询却要耗时一秒以上。 不过,Hibernate也提供了一些方式来提高多表查询性能:可以通过查询策略来优化生成的sql语句,也可以通过缓存来减少sql的生成。下面就介绍下我对查询及缓存策略如何优化查询性能的一些测试与研究。 查询策略 先介绍一下查询策略,指的是Hibernate在查询

Yaber的博客 679

Spring 整合 Hibernate 时启用二级缓存

写在前面:   1. 本例使用 Hibernate3 + Spring3;   2. 本例的查询使用了 HibernateTemplate; 1. 导入 ehcache-x.x.x.jar 包; 2. 在 applicationContext.xml 文件中找到 sessionFactory 相应的配置信息并在设置 hibernateProperties 中添加如下

Shawearn 2182

Hibernate二级缓存配置

Hibernate的二级缓存 Hibernate的Session在事务级别进行持久化数据的缓存操作。 当然,也有可能分别为每个类(或集合),配置集群、或JVM级别(SessionFactory级别)的缓存。 你甚至可以为之插入一个集群的缓存。注意,缓存永远不知道其他应用程序对持久化仓库(数据库)可能进行的修改 (即使可以将缓存数据设定为定期失效)。 通过在hibernate.c

1880
上一篇: Exception in thread "main" org.hibernate.MappingException: You may only specify a cache for root <cl
下一篇: Spring第一篇【介绍Spring、引入Spring、Spring六大模块】
Java3y
Java3y 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 1万+粉丝 509原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值