何时以及如何使用hibernate二级缓存?

2024-01-07

我很难理解休眠何时命中二级缓存以及何时使缓存失效。

目前我的理解是这样的:

  • 二级缓存存储会话之间的实体,范围是SessionFactory
  • 您必须告诉要缓存哪些实体,默认情况下不会缓存任何实体
  • 查询缓存将查询结果存储在缓存中。

我不明白的是

  • hibernate什么时候命中这个缓存?
  • 假设我设置了二级缓存,但没有设置查询缓存。我想缓存我的客户,有 50000 个。我可以通过哪些方式从缓存中检索客户?
  • 我假设我可以通过 id 从缓存中获取它们。这很容易,但也不值得缓存。但是如果我想对所有客户进行一些计算该怎么办?假设我想显示客户列表,那么我该如何访问他们呢?
  • 如果禁用查询缓存,我将如何获得所有客户?
  • What would happen if someone updated one of the customers?
    • 该客户会在缓存中失效还是所有客户都会失效?

或者我认为缓存完全错误?在这种情况下,二级缓存的更合适用途是什么? hibernate 文档根本不清楚缓存实际上是如何工作的。仅提供有关如何设置的说明。

Update:所以我开始明白二级缓存(没有查询缓存)对于通过 id 加载数据很有好处。例如,我有一个用户对象,我想检查 Web 应用程序中每个请求的权限。这是通过将用户缓存在二级缓存中来减少数据库访问的好案例吗?就像我将用户 ID 存储在会话中或任何地方,当我需要检查权限时,我会按用户 ID 加载用户并检查权限。


首先,我们来谈谈进程级缓存(或者在 Hibernate 中称为二级缓存)。为了让它发挥作用,你应该

  1. 配置缓存提供者
  2. 告诉 hibernate 要缓存哪些实体(如果使用这种映射,就在 hbm.xml 文件中)。

您告诉缓存提供程序应存储多少对象以及它们何时/为何应失效。假设您有一本书和一个作者实体,每次您从数据库获取它们时,只有那些不在缓存中的实体才会从实际数据库中选择。这显着提高了性能。它在以下情况下很有用:

  • 您只能通过 Hibernate 写入数据库(因为它需要一种方法来知道何时更改或使缓存中的实体无效)
  • 你经常阅读物体
  • 您只有一个节点,并且没有复制。否则,您需要复制缓存本身(使用像 JGroups 这样的分布式缓存),这会增加更多的复杂性,并且它的扩展性不如不共享应用程序。

那么缓存什么时候起作用呢?

  • 当你session.get() or session.load()先前选择并驻留在缓存中的对象。缓存是一种存储,其中 ID 是键,属性是值。因此,只有当可以通过 ID 进行搜索时,您才能消除对数据库的访问。
  • 当您的关联是延迟加载的(或使用选择而不是连接进行急切加载)时

但在以下情况下它不起作用:

  • 如果不按ID选择。同样,二级缓存存储实体 ID 到其他属性的映射(它实际上并不存储对象,而是数据本身),因此如果您的查找如下所示:from Authors where name = :name,那么你就不会命中缓存。
  • 当你使用 HQL 时(即使你使用where id = ?).
  • 如果在您的映射中设置fetch="join",这意味着要加载关联,连接将在任何地方使用,而不是单独的选择语句。进程级缓存仅在以下情况下才适用于子对象:fetch="select"用来。
  • 即使你有fetch="select"但随后在 HQL 中,您使用联接来选择关联 - 这些联接将立即发出,并且它们将覆盖您在 hbm.xml 或注释中指定的任何内容。

现在,关于查询缓存。您应该注意,它不是一个单独的缓存,而是对进程级缓存的补充。假设您有一个 Country 实体。它是静态的,所以你知道每次当你说时都会有相同的结果集from Country。这是查询缓存的完美候选者,它将存储一个列表IDs当您下次选择所有国家/地区时,它将将此列表返回到进程级缓存,而后者又将返回每个 ID 的对象,因为这些对象已存储在二级缓存中。 每次与实体相关的任何内容发生更改时,查询缓存都会失效。假设您配置了from Authors被放入查询缓存中。由于作者经常更换,因此不会有效。因此,您应该仅对或多或少的静态数据使用查询缓存。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

何时以及如何使用hibernate二级缓存? 的相关文章

随机推荐

  • ( HTML5、JQuery)JQuery 忽略输入元素的属性

    在 HTML5 中 当我制作如下所示的文本框 然后按提交按钮时
  • oxyplot轴在鼠标滚轮时锁定中心

    我是 wpf 和 oxyPlot 的新手 现在 我想创建一个像示波器一样的动态折线图 但我不知道如何在鼠标滚轮缩放时将轴锁定在某个值上 Example 红点是鼠标所在位置 正常情况下 缩放A gt B 缩放C gt D 现在 我想缩放C g
  • 预编译核心服务客户端与生成您自己的代理

    自 2011sp1 起 Tridion 附带了预编译的核心服务客户端 是否还有理由通过添加服务引用来生成您自己的代理 或者那个旧方法现在已经被正式弃用了吗 让我们看一下编译的 dll 与服务引用的优点 核心服务不断增长 在较慢的网络上生成服
  • Card.io SDK 给出部分信用卡号

    我目前正在使用从以下位置下载的 card io SDK 进行信用卡集成github https github com card io card io iOS SDK 它效果很好 但必须手动输入到期日期和 cvv 号码 我搜索了一下并发现 较
  • 有没有办法通过其标签值查询AWS RDS实例?

    按照这个https docs aws amazon com cli latest reference rds describe db instances html https docs aws amazon com cli latest r
  • 在 Android 中使用 iBeacons 进行三边测量

    我们希望使用 iBeacons 实现某种室内位置确定 这篇文章看起来真的很有趣 http techblog rga com determining indoor position using ibeacon 其中作者使用 Eigen C 库
  • 在firebase中获取所属组用户的详细信息

    下面是我的数据库结构firebase 我只有登录用户 ID User userId Name age groups groupId1 true groupId2 true Group groupId name desc UserId Use
  • 无法将类型“System.Windows.Controls.WebBrowser”转换为“SHDocVw.DWebBrowserEvents”

    我从网站上看到一个例子http msdn microsoft com en us library system windows controls webbrowser 28v VS 90 29 aspx http msdn microsof
  • 降级分配。如果警告仍然存在,请考虑增加苗圃规模

    打开已添加到应用程序的新屏幕时 我收到以下消息 警告 分配降级 如果警告仍然存在 请考虑增加苗圃规模 我假设有一个构建参数可以用来增加托儿所的大小 有谁知道参数是什么以及如何格式化它 您可能固定了太多对象 或者使用了太多线程 根据http
  • 如何将三元运算符合并到优先级攀爬算法中?

    我遵循 优先级攀登 部分中给出的解释这个网页 http www engr mun ca theo Misc exp parsing htm climbing使用具有各种一元前缀和二元中缀运算符的优先级攀爬算法来实现算术求值器 我还想包括三元
  • Android Base64 编码和解码在单元测试中返回 null

    我正在尝试使用 Android 中的 Base64 编码字符串进行解码http developer android com reference android util Base64 html http developer android
  • 在 Restkit 0.2 中为给定类添加两个请求描述符

    我需要从 User 类发出两种不同类型的 POST JSON Type A password 12345 email email protected cdn cgi l email protection JSON Type B user P
  • CSS边距碰撞

    有没有办法检测并防止边缘冲突 就像如果我有 div style margin bottom 10px div div style margin top 10px div 我在它们之间有 20 像素的空间 但我需要 10 像素 您不需要做任何
  • Excel ODBC 数据连接查询刷新每个查询所需的时间

    我正在尝试测试从 Excel 数据连接运行的查询的三种变体 我有三个单独的数据连接和三个单独的选项卡 分别从每个连接获取数据 每个查询的连接字符串都是相同的 只是命令文本 Oracle SQL 不同 Excel中有没有办法查看每个查询的执行
  • scanf 的工作并检查输入是否为 int

    我想检查给定的输入是否是整数输入 我不想将输入存储在字符串中 在看到 stackoverflow 上的几个问题以及点击和试用后 我创建了以下代码 while scanf d c num a 2 a n printf Please enter
  • BigQuery - 获取 BigQuery 表中的总列数

    有没有办法查询 BigQuery 表中的总列数 我浏览了 BigQuery 文档 但没有找到任何相关内容 提前致谢 使用 SQL 查询和内置 INFORMATION SCHEMA 表 SELECT count distinct column
  • 连接到主站的从站列表 - Hudson

    有没有办法以编程方式找到它 我需要它作为自动运行的一部分 因此 如果存在可以提供此功能的现有远程 API 调用 这将非常有帮助 您不需要解析 HTML 大多数 Hudson 页面都可以通过添加 URL 后缀来转换为 API 调用 例如进行
  • 使用 Visual Fox Pro OleDb

    我正在尝试使用 C 将 DBF 文件中的数据提取到我的程序中 我正在使用 Visual FoxPro OLE DB 提供程序 它在我的本地计算机上运行良好 但我想将我的程序打包成客户端可以使用的 dll 问题是 当他们从自己的计算机上运行该
  • CMake 可以识别具有另一个名称(CMakeLists_nightly.txt)的 CMakeLists.txt 吗?

    我想要创建更具体命名的 CMakeLists txt 文件 例如 CMakeLists nightly txt CMakeLists weekly txt 等 我想这样做的原因是为了减少项目中文件夹层次结构的混乱 我可以轻松地将每个文件放在
  • 何时以及如何使用hibernate二级缓存?

    我很难理解休眠何时命中二级缓存以及何时使缓存失效 目前我的理解是这样的 二级缓存存储会话之间的实体 范围是SessionFactory 您必须告诉要缓存哪些实体 默认情况下不会缓存任何实体 查询缓存将查询结果存储在缓存中 我不明白的是 hi