Hibernate中的缓存

深入理解Hibernate中的一级缓存、二级缓存与查询缓存
本文详细解析Hibernate中的一级缓存、二级缓存与查询缓存的原理、作用及配置方法,旨在帮助开发者优化数据库性能,提升应用程序响应速度。

Hibernate中的缓存

 

一、Hiberante中常见的三大缓存:一级缓存,二级缓存和查询缓存。

Hibernate中提供了两级Cache,第一级别的缓存是Session级别的缓存,它是属于事务范围的缓存。这一级别的缓存是由hibernate管理的,一般情况下无需进行干预;第二级别的缓存是SessionFactory级别的缓存,它是属于进程范围或群集范围的缓存。这一级别的缓存可以进行配 置和更改,并且可以动态加载和卸载。 Hibernate还为查询结果提供了一个查询缓存,它依赖于第二级缓存。

 

 

      二、 首先需要了解的真相:

     1、 缓存是数据库数据在内存中的临时容器,它包含了库表数据在内存中的临时拷贝,位于数据库和访问层之间。

     2、ORM在进行数据读取时,会根据缓存管理策略,首先在缓冲中查询,如果发现,则直接使用,避免数据库调用的开销。

      3、数据缓存的策略:
事务级缓存:当前事务范围内的数据缓存
应用级缓存:某个应用中的数据缓存
分布式缓存:多个应用,多个JVM之间共享缓存。分布式缓存由多个应用级缓存实例组成集群,通过某种远程机制实现各个缓存实例之间的数据同步,任何一个实例的数据修改后,将导致整个集群间的数据状态同步。

     4、Hibernate的缓存在以下情况下发挥作用:

根据主键加载实体  get,load
加载关联对象

使用HQL查询时 List,iterator

 

   5、每个事务都有单独的第一级缓存,二级缓存被同一个进程或集群范围内的所有事务共享由于每个事务都拥有单独的第一级缓存,所以一级缓存不会出现并发问题,无需 提供并发访问策略,由于多个事务会同时访问第二级缓存中相同数据,因此二级缓存必须提供适当的并发访问策略,来保证特定的事务。

   6、处于一级缓存中的对象永远不会过期,除非应用程序显式清空缓存或者清除特定的对象。而二级缓存中必须提供数据过期策略,如基于内存的缓存中的对象的最大数 目,允许对象处于缓存中的最长时间,以及允许对象处于缓存中的最长空闲时间,物理存储介质可包括内存和硬盘。对象存放在基于内存的缓存中,当内存中对象的 数目达到数据过期策略中指定上限时,就会把其余的对象写入基于硬盘的缓存中。

 

 

二. 一级缓存和二级缓存比较:

 

一级缓存:

 

1、一级缓存的数据结构是Map,用于存储查询实体。Map的key存放实体的Id,Map的value存放实体本身。所以一级缓存无法存储查询的属性。

 

2、一级缓存的生命周期与Session有关,Session产生则一级缓存创建,Session关闭则一级缓存销毁。

 

3、Get,Load,Iterator方法将读写一级缓存,而List方法只写不读一级缓存。

 

4、一级缓存不能禁用,但可以通过Session的clear方法和evict方法清理一级缓存,从而达到禁止写缓存的效果。


5、Session的save方法会写缓存,在批量插入数据时要注意对一级缓存做定时清理。Hibernate的批量处理效率不高,建议使用Session.connection()获得Jdbc连接后使用Jdbc的相关API做批处理操作

 

二级缓存:

 

1、二级缓存也称进程级的缓存或SessionFactory级的缓存,二级缓存可以被所有的session共享。

 

2、二级缓存的生命周期和SessionFactory的生命周期一致,SessionFactory可以管理二级缓存。

 

3、Hibernate 默认情况下是打开的,提供一个Hashtable存储二级缓存,但只适用于研发,开发中为第三方缓存组件提供了接入接口,我们可以根据不同情况选择不同的实现。

 

4、二级缓存也只能缓存实体对象,不缓存属性。

 

5、ehcache二级缓存的配置和使用:
* 将echcache.xml文件拷贝到src下
* 开启二级缓存,修改hibernate.cfg.xml文件
<property name="hibernate.cache.use_second_level_cache">true</property>
* 指定缓存产品提供商,修改hibernate.cfg.xml文件
<property           name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>

 

* 指定哪些实体类使用二级缓存(两种方法
  1)在映射文件中采用<cache>标签
  2)在hibernate.cfg.xml文件中,采用<class-cache>标签

 

 二级缓存的特性:

 

1、Get,Load,Iterator方法读写二级缓存,而List方法只写不读二级缓存

 

2、设置<property name=“hibernate.cache.use_second_level_cache”>fasle</property>可以禁用二级缓存。

 

3、在一次Session交互中,可以设置Session的CacheMode为Put来禁用读操作,设置CacheMode为Get来禁用写操作。

 

4、 也可以通过SessionFacotry的evict方法清理二级缓存来达到禁止写二级缓存的效果

    

 查询缓存:

 

1、查询缓存是针对普通属性结果集的缓存,对实体对象的结果集只缓存id 。

 

2、查询缓存的生命周期为当前关联的表发生修改,那么查询缓存生命周期结束。

 

3、查询缓存的配置和使用:
* 在hibernate.cfg.xml文件中启用查询缓存,如:
<property name="hibernate.cache.use_query_cache">true</property>


* 在程序中必须手动启用查询缓存,如:
query.setCacheable(true);


4、List方法读写查询缓存,Iterator不读查询缓存 。  二级缓存和查询缓存搭配使用效果最佳

 

Delphi 12.3 作为一款面向 Windows 平台的集成开发环境,由 Embarcadero Technologies 负责其持续演进。该环境以 Object Pascal 语言为核心,并依托 Visual Component Library(VCL)框架,广泛应用于各类桌面软件、数据库系统及企业级解决方案的开发。在此生态中,Excel4Delphi 作为一个重要的社区开源项目,致力于搭建 Delphi 与 Microsoft Excel 之间的高效桥梁,使开发者能够在自研程序中直接调用 Excel 的文档处理、工作表管理、单元格操作及宏执行等功能。 该项目以库文件与组件包的形式提供,开发者将其集成至 Delphi 工程后,即可通过封装良好的接口实现对 Excel 的编程控制。具体功能涵盖创建与编辑工作簿、格式化单元格、批量导入导出数据,乃至执行内置公式与宏指令等高级操作。这一机制显著降低了在财务分析、报表自动生成、数据整理等场景中实现 Excel 功能集成的技术门槛,使开发者无需深入掌握 COM 编程或 Excel 底层 API 即可完成复杂任务。 使用 Excel4Delphi 需具备基础的 Delphi 编程知识,并对 Excel 对象模型有一定理解。实践中需注意不同 Excel 版本间的兼容性,并严格遵循项目文档进行环境配置与依赖部署。此外,操作过程中应遵循文件访问的最佳实践,例如确保目标文件未被独占锁定,并实施完整的异常处理机制,以防数据损毁或程序意外中断。 该项目的持续维护依赖于 Delphi 开发者社区的集体贡献,通过定期更新以适配新版开发环境与 Office 套件,并修复已发现的问题。对于需要深度融合 Excel 功能的 Delphi 应用而言,Excel4Delphi 提供了经过充分测试的可靠代码基础,使开发团队能更专注于业务逻辑与用户体验的优化,从而提升整体开发效率与软件质量。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值