0

0

说一下 hibernate 的缓存机制?

月夜之吻

月夜之吻

发布时间:2025-09-12 08:04:01

|

331人浏览过

|

来源于php中文网

原创

Hibernate缓存机制通过一级缓存(Session级)和二级缓存(SessionFactory级)减少数据库访问,提升性能。一级缓存默认开启,同一Session内重复查询不触发数据库访问;二级缓存需配置,如使用Ehcache并设置缓存策略(如READ_WRITE),实现跨Session共享;查询缓存则缓存查询结果ID列表,需结合二级缓存生效,三者均需注意数据一致性与失效策略。

说一下 hibernate 的缓存机制?

Hibernate 的缓存机制,简单来说,就是为了减少数据库访问,提升应用性能。它分为一级缓存和二级缓存,一级缓存是 Session 级别的,事务结束就失效;二级缓存是 SessionFactory 级别的,可以跨 Session 共享,但需要配置。

Hibernate 缓存机制,具体如何运作,又该如何配置和使用呢?

Hibernate 一级缓存:不得不说的秘密

一级缓存,也叫 Session 缓存,是 Hibernate 默认开启的,你几乎感觉不到它的存在,但它却默默地工作着。它存在于 Session 的生命周期内,任何通过 Session 加载的对象都会被缓存起来。这意味着,在同一个 Session 中,如果你多次加载同一个 ID 的对象,Hibernate 只会执行一次数据库查询,后续的加载直接从缓存中获取。

举个例子,假设我们有一个

User
类,ID 为 1。

Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();

User user1 = session.get(User.class, 1);
User user2 = session.get(User.class, 1); // 不会再次查询数据库

System.out.println(user1 == user2); // 输出 true

transaction.commit();
session.close();

在这个例子中,

user1
user2
指向的是同一个对象,因为第二次
session.get()
直接从一级缓存中获取了数据。

一级缓存的优点是简单易用,无需任何配置。缺点也很明显,它只能在 Session 范围内有效,一旦 Session 关闭,缓存也就失效了。另外,一级缓存容易出现脏读,如果其他 Session 修改了数据库中的数据,当前 Session 的缓存可能就不是最新的了。

为了避免脏读,你可以使用

session.refresh(object)
方法强制刷新缓存,从数据库中重新加载数据。或者,在查询中使用
LockMode
来锁定对象,防止其他 Session 修改。

Hibernate 二级缓存:性能提升的利器

二级缓存,也叫 SessionFactory 缓存,是可选的,需要手动配置。它可以跨 Session 共享数据,大大减少数据库访问,提高应用性能。

Hibernate 支持多种二级缓存实现,常用的有 Ehcache、OSCache、Infinispan 等。选择哪种缓存实现,取决于你的具体需求和应用场景。Ehcache 简单易用,适合小型应用;Infinispan 功能强大,适合大型分布式应用。

以 Ehcache 为例,配置 Hibernate 二级缓存需要在

hibernate.cfg.xml
文件中添加以下配置:

true
org.hibernate.cache.ehcache.EhCacheRegionFactory
/ehcache.xml

其中,

hibernate.cache.use_second_level_cache
启用二级缓存,
hibernate.cache.region.factory_class
指定缓存工厂类,
net.sf.ehcache.configurationResourceName
指定 Ehcache 的配置文件。

Ehcache 的配置文件

ehcache.xml
定义了缓存的各种属性,例如最大缓存对象数量、缓存过期时间等。

网胜B2B电子商务系统蓝色风格 2008 SP6.2 普及版
网胜B2B电子商务系统蓝色风格 2008 SP6.2 普及版

  websenB2B是一套经过完善设计的B2B行业网站程序,是windows nt系列环境下最佳的B2B行业网产站解决方案。精心设计的架构与功能机制,适合从个人到企业各方面应用的要求,为您提供一个安全、稳定、高效、易用而快捷的行业网站商务系统。分普及版和商业版等不同版本。一、网胜B2B电子商务系统SP6.2蓝色风格普及版本升级功能说明:1、邮件群发功能:可以选择某一级别的会员,并放入支持html

下载


    

    

    

配置好二级缓存后,还需要指定哪些实体类需要被缓存。可以在实体类的

@Entity
注解上添加
@Cache
注解:

import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class User {

    @Id
    private Long id;
    private String name;

    // getter and setter
}

@Cache
注解的
usage
属性指定了缓存的并发策略,常用的有
READ_ONLY
NONSTRICT_READ_WRITE
READ_WRITE
TRANSACTIONAL
。选择哪种并发策略,取决于你的应用场景和数据更新频率。

READ_ONLY
适合只读数据,
READ_WRITE
适合读写频繁的数据,
NONSTRICT_READ_WRITE
适合读多写少的数据,
TRANSACTIONAL
适合需要事务支持的数据。

二级缓存的优点是可以跨 Session 共享数据,提高应用性能。缺点是配置复杂,需要选择合适的缓存实现和并发策略。另外,二级缓存也容易出现数据不一致的问题,需要注意缓存的失效策略和数据更新机制。

查询缓存:针对查询结果的缓存

除了实体缓存,Hibernate 还提供了查询缓存,用于缓存查询结果。查询缓存可以避免重复执行相同的查询,提高查询效率。

要使用查询缓存,需要在

hibernate.cfg.xml
文件中添加以下配置:

true

然后在查询中使用

setCacheable(true)
方法启用查询缓存:

Query query = session.createQuery("from User where name = :name");
query.setParameter("name", "test");
query.setCacheable(true);
List users = query.list();

查询缓存会将查询结果的 ID 列表缓存起来,下次执行相同的查询时,Hibernate 会先从缓存中获取 ID 列表,然后根据 ID 从二级缓存中加载对象。

查询缓存的优点是可以避免重复执行相同的查询,提高查询效率。缺点是只缓存 ID 列表,需要结合二级缓存才能发挥最大效果。另外,查询缓存也容易出现数据不一致的问题,需要注意缓存的失效策略和数据更新机制。

如何选择合适的缓存策略?

选择合适的缓存策略,需要综合考虑以下因素:

  • 数据访问模式: 如果数据读多写少,可以选择
    READ_ONLY
    NONSTRICT_READ_WRITE
    策略;如果数据读写频繁,可以选择
    READ_WRITE
    策略;如果需要事务支持,可以选择
    TRANSACTIONAL
    策略。
  • 数据更新频率: 如果数据更新频繁,需要设置较短的缓存过期时间;如果数据更新较少,可以设置较长的缓存过期时间。
  • 应用规模: 如果应用规模较小,可以选择简单的缓存实现,例如 Ehcache;如果应用规模较大,可以选择功能强大的缓存实现,例如 Infinispan。
  • 数据一致性要求: 如果对数据一致性要求较高,需要注意缓存的失效策略和数据更新机制。

总而言之,Hibernate 的缓存机制是一个强大的工具,可以有效提高应用性能。但是,使用缓存也需要谨慎,需要根据具体情况选择合适的缓存策略,并注意缓存的数据一致性问题。

相关专题

更多
什么是分布式
什么是分布式

分布式是一种计算和数据处理的方式,将计算任务或数据分散到多个计算机或节点中进行处理。本专题为大家提供分布式相关的文章、下载、课程内容,供大家免费下载体验。

325

2023.08.11

分布式和微服务的区别
分布式和微服务的区别

分布式和微服务的区别在定义和概念、设计思想、粒度和复杂性、服务边界和自治性、技术栈和部署方式等。本专题为大家提供分布式和微服务相关的文章、下载、课程内容,供大家免费下载体验。

233

2023.10.07

hibernate和mybatis有哪些区别
hibernate和mybatis有哪些区别

hibernate和mybatis的区别:1、实现方式;2、性能;3、对象管理的对比;4、缓存机制。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

140

2024.02.23

Hibernate框架介绍
Hibernate框架介绍

本专题整合了hibernate框架相关内容,阅读专题下面的文章了解更多详细内容。

81

2025.08.06

Java Hibernate框架
Java Hibernate框架

本专题聚焦 Java 主流 ORM 框架 Hibernate 的学习与应用,系统讲解对象关系映射、实体类与表映射、HQL 查询、事务管理、缓存机制与性能优化。通过电商平台、企业管理系统和博客项目等实战案例,帮助学员掌握 Hibernate 在持久层开发中的核心技能。

35

2025.09.02

Hibernate框架搭建
Hibernate框架搭建

本专题整合了Hibernate框架用法,阅读专题下面的文章了解更多详细内容。

64

2025.10.14

session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

311

2023.10.17

session失效解决方法
session失效解决方法

session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。

740

2023.10.18

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

8

2026.01.20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
XML教程
XML教程

共142课时 | 5.7万人学习

【web前端】Node.js快速入门
【web前端】Node.js快速入门

共16课时 | 2万人学习

php-src源码分析探索
php-src源码分析探索

共6课时 | 0.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号