嗨: 我对休眠缓存缓存的内容感到困惑。
从文档中,我知道hibernate中有一些类型的缓存。
第一级:交易级。 看来会话要持久化的实体都缓存在这里了。
二级缓存:我真的不知道这个缓存,从api来看,它说这个缓存在sessionfactory级别工作......我无法理解。
查询缓存:这对我来说很容易理解(也许我错了)。它将查询参数与相关实体一起缓存。
这就是我对hibernate中缓存的所有了解。
谁可以告诉我更多详情?
顺便说一句,我不擅长sql/jdbc工作,所以我也想知道我应该如何了解sql/jdbc以了解更多关于hibernate的信息(有文档吗?)?我不想只是一个 hibernate 用户,因为它只是一个工具,我想要的是从这个美妙的框架中学习一些东西。 :)
一级缓存
此缓存默认启用。 当 NHibernate 通过数据库中唯一的 id 加载实体时,它会自动放入所谓的身份映射中。该标识映射代表第一级缓存。
一级缓存的生命周期与当前会话耦合。当前会话关闭后,相应一级缓存的内容就会被清除。一旦实体位于第一级缓存中,想要在当前会话中加载完全相同的实体的后续操作就会从缓存中检索该实体,并且不需要往返数据库。
此实体映射背后的主要原因之一是避免内存中的两个不同实例可以代表相同的数据库记录(或实体)的情况。
(改编自 NH 常见问题解答)
二级缓存
此缓存位于单个会话范围缓存之上。使用此缓存,您可以节省与数据库的多次往返,因为任何会话中的任何人第一次加载确定的实体时,它都会保留在缓存中,因此下一个请求(来自任何其他会话)将从缓存中获取它。
要使用 L2 缓存,您将需要缓存提供程序,例如 SysCache 或 Memcache。这些人会将缓存实体的值存储为按实体 ID 散列的操作系统字符串数组。需要注意的是,缓存的不是 .net 对象,而是它的值。
据说它与会话工厂绑定在一起,因为缓存将对确定的会话工厂创建的会话起作用,因此不同会话工厂创建的会话不会共享缓存。您清楚会话工厂的概念吗?
查询缓存
这个确实很简单,但有一个问题。它将缓存查询及其参数,但不会缓存返回的实体。它只会缓存它们的 Id,因此它仅对 L2 缓存有意义,因为它包含与该 Id 关联的值。
NHiernate关于缓存的FAQ条目:
对于L2缓存具体有
@NaturalId
注释)