Hibernate 二级缓存是 Hibernate 对象关系映射(ORM)库中可用的数据缓存组件之一。Hibernate 是 Java 语言中广受欢迎的 ORM 库,它允许你将 Java 对象数据存储在关系型数据库管理系统(RDBMS)中。
由于 Java 对象与 RDBMS 中的表/行/列结构天然不匹配(这种现象被称为“阻抗失配”),Hibernate 充当了二者之间的转换层。通过 Hibernate,你可以轻松快速地访问关系型数据,因为它提供了从关系数据库的表、行、列和外键到带注解的 Java 类之间的映射机制。Hibernate 能根据面向对象的 Java 领域模型,以简单易用的语法自动生成 SQL 查询语句。
二级缓存通过集成第三方缓存技术来扩展 Hibernate 内置的缓存能力。它的引入旨在克服一级缓存的局限性(如下所述)。
Hibernate 的缓存层级有哪些?
缓存是 Hibernate 框架的一大优势,它支持多个层级的缓存机制。
一级缓存 是 Hibernate 检查缓存数据的第一个位置。它内置于框架中,并默认启用,用于减少直接对数据库执行的 SQL 查询次数。如果请求的查询结果不在一级缓存中,那么就会向底层数据库发起查询(前提是未启用二级缓存)。该缓存仅在会话(Session)级别生效,这意味着每个 Session 对象独立缓存数据,不同 Session 之间无法共享缓存数据,并且当 Session 关闭时,其缓存的数据也会被清除。因此,一级缓存仅适用于同一 Session 中的重复查询。
对于跨多个 Session 的重复查询,则需要依赖 二级缓存。
通过 Hibernate 二级缓存,你可以集成一种缓存技术来补充一级缓存的功能。当一级缓存中未命中所需数据时,Hibernate 会继续检查二级缓存。二级缓存中的数据可在多个 Session 之间共享,因此所有使用相同 SessionFactory 创建的 Session(即所有用户)都能受益于缓存数据——即使这些数据是由另一个 Session 插入的,即使插入数据的 Session 已经关闭。
为什么 Hibernate 需要二级缓存?
二级缓存能够显著提升应用程序在持久化操作方面的性能,尤其适用于使用同一 SessionFactory 创建的所有 Session。借助二级缓存,对象请求可以直接由缓存提供服务,即使该请求来自多个不同的 Session,其延迟也远低于直接访问数据库。考虑到 ORM 查询通常较为复杂,执行速度相对较慢,系统可以通过二级缓存有效减少对底层数据库重复执行相同复杂/慢速查询的次数。
这一点在高并发 Web 应用中尤为关键——这类应用通常存在大量用户执行相同或高度相似的数据库查询。配合具备高可扩展性的缓存系统,你可以缓存更多数据,从而获得更显著的性能加速效果。
哪些技术可用作 Hibernate 二级缓存?
任何支持与 Hibernate 开箱即用集成的技术,都可以作为二级缓存插件使用。内存数据网格(In-Memory Data Grids)常被用作 Hibernate 的二级缓存。例如,Hazelcast IMDG 就内置了与 Hibernate 的集成能力,可以轻松配置为二级缓存。凭借其分布式架构,你可以通过向集群中添加更多节点,按需横向扩展缓存容量,以应对更重的工作负载。