我无法理解hibernate何时进入二级缓存以及何时使缓存失效。
这是我目前所了解的:
我不明白的是
还是我认为缓存完全错误?在这种情况下,更适合使用二级缓存?hibernate文档根本不清楚高速缓存实际上是如何工作的。只有有关如何进行设置的说明。
更新: 因此,我开始理解二级缓存(不带查询缓存)对于按ID加载数据非常有用。例如,我有一个用户对象,我想检查Web应用程序中每个请求的权限。通过在二级缓存中缓存用户来减少数据库访问是否是一个好案例?就像我将用户ID存储在会话中或在需要检查权限的任何地方一样,我将通过其ID加载用户并检查权限。
首先,让我们谈谈进程级缓存(或在Hibernate中称为二级缓存)。要使其正常工作,您应该
您告诉缓存提供程序应存储多少个对象以及何时/为什么使它们无效。因此,假设您有一个Book和Author实体,每次从数据库中获取它们时,只会从实际的DB中选择那些不在缓存中的实体。这样可以显着提高性能。在以下情况下很有用:
那么什么时候缓存起作用?
session.get()
session.load()
但是在以下情况下不起作用:
from Authors where name = :name
where id = ?
fetch="join"
fetch="select"
现在,关于查询缓存。您应该注意,它不是一个单独的缓存,它是对进程级缓存的补充。假设您有一个Country实体。它是静态的,所以您知道每次说时都会有相同的结果集from Country。这是查询缓存的理想选择,它将自身存储一个 ID 列表,当您下次选择所有国家/地区时,它将把此列表返回到流程级缓存,而后者又将为每个ID返回对象。因为这些对象已经存储在二级缓存中。每当与实体相关的任何更改时,查询缓存都会失效。因此,假设您已配置from Authors为放置在查询缓存中。由于作者经常更改,因此无效。
from Country
from Authors