我无法理解hibernate何时进入二级缓存以及何时使缓存失效。
这是我目前所了解的:
我不明白的是
还是我认为缓存完全错误?在这种情况下,更适合使用二级缓存?hibernate文档根本不清楚高速缓存实际上是如何工作的。只有有关如何进行设置的说明。
更新:
因此,我开始理解二级缓存(不带查询缓存)对于按ID加载数据非常有用。例如,我有一个用户对象,我想检查Web应用程序中每个请求的权限。通过在二级缓存中缓存用户来减少数据库访问是否是一个好案例?就像我将用户ID存储在会话中或在需要检查权限的任何地方一样,我将通过其ID加载用户并检查权限。
首先,让我们谈谈进程级缓存(或在Hibernate中称为二级缓存)。要使其正常工作,您应该
您告诉缓存提供程序应存储多少个对象以及何时/为什么使它们无效。因此,假设您有一个Book和Author实体,每次从数据库中获取它们时,只会从实际的DB中选择那些不在缓存中的实体。这样可以显着提高性能。在以下情况下很有用:
那么什么时候缓存起作用?
session.get()
或session.load()
先前选择并驻留在缓存中的对象时。缓存是一种存储,其中ID是键,属性是值。因此,只有在有可能通过ID搜索时,您才可以消除命中数据库的麻烦。但是在以下情况下不起作用:
from Authors where name = :name
,则不要命中缓存。where id = ?
)。fetch="join"
,这意味着要加载关联,联接将在各处使用,而不是单独的select语句。进程级缓存仅在fetch="select"
使用子对象时才起作用。fetch="select"
但随后在HQL中,您也可以使用联接来选择关联-这些联接将立即发出,并且它们将覆盖您在hbm.xml或注释中指定的内容。现在,关于查询缓存。您应该注意,它不是一个单独的缓存,它是对进程级缓存的补充。假设您有一个Country实体。它是静态的,所以您知道每次说时都会有相同的结果集from Country
。这是查询缓存的理想选择,它将自身存储一个 ID
列表,当您下次选择所有国家/地区时,它将把此列表返回到流程级缓存,而后者又将为每个ID返回对象。因为这些对象已经存储在二级缓存中。每当与实体相关的任何更改时,查询缓存都会失效。因此,假设您已配置from Authors
为放置在查询缓存中。由于作者经常更改,因此无效。
问题内容: 我正在使用Spring + JPA + Hibernate。我正在尝试启用Hibernate的二级缓存。在我的春天,我有: 运行时出现错误: 所以有人抱怨我没有启用二级缓存。我试图通过添加到我的启用它: 但是仍然没有喜悦。我还尝试将其添加到ehcache.xml中: 但这仍然行不通。将更改为也无济于事: 我的实体类被注释为使用缓存 那么,如何启用二级缓存? 编辑: 这是在bean下:
问题内容: 什么时候应该使用ThreadLocal变量? 如何使用? 问题答案: 一种可能的(并且是常见的)用法是,当你有一些不是线程安全的对象,但又希望避免同步对该对象的访问时(我正在看着你,SimpleDateFormat)。而是给每个线程自己的对象实例。 例如:
问题内容: 我目前正在使用 Spring MVC4 和 hibernate 4 开发应用程序。我已经实现了 hibernate二级缓存, 以提高性能。如果我使用 Redis ,它是内存中的数据结构存储,用作数据库,缓存等,性能会提高,但是会发生巨大变化吗? 问题答案: 如果您缓存什么是要缓存的东西,并避免缓存根本不应该缓存的数据,则可能会出现巨大的差异。情人眼中的美丽就像表演一样。使用hibern
问题内容: 我读包含在大括号关键字后的代码块中一个的上下文中流动,必须调用标有一个函数使用属性或传输控制,,或。 最后一部分很清楚,而第一部分我不太清楚。 首先,即使您未声明任何返回类型,任何函数都将返回某些内容(至少一个空元组)。其次,什么时候可以使用函数?文档是否建议一些标记为的内置内置方法? Guard语句的else子句是必需的,并且必须调用带有noreturn属性标记的函数,或者使用以下语
问题内容: 创建ajax请求时,GET over POST有什么优势,反之亦然?我如何知道在任何给定时间应该使用哪个?这是安全意识的决定吗? 此外,实际发送方式有何不同? 问题答案: POST请求是您不想意外发生的请求。GET请求是您可以通过用户通过URL指向浏览器来进行的请求。 GET请求可以非常简单地重复,因为它们的数据基于URL本身。 您应该像考虑常规表单请求(及其GET和POST)一样考虑
问题内容: 这是成功的send()是“原子的”吗?,因为我认为它实际上实际上涉及系统调用,而不仅仅是在套接字上发送。 哪些系统调用可以被中断,何时中断,中断在哪里处理?我已经了解了SA_RESTART,但并不完全了解发生了什么。 如果我在没有SA_RESTART的情况下进行系统调用,该调用是否可以被与我的应用程序无关但需要操作系统中止我的调用并执行其他操作的任何类型的中断(例如,用户输入)中断?还