Hibernate缓存保存了什么?

7

您好: 我对hibernate缓存中的内容产生了疑问。

从文档中,我知道hibernate有三种类型的缓存。

一级缓存: 事务级别。 似乎会在此处缓存要由session持久化的实体。

二级缓存: 对于这个缓存,我真的不知道。从api来看,它工作在sessionfactory级别……我无法理解。

查询缓存: 对于我来说很容易理解(也许我错了)。它会将查询参数以及相关实体缓存起来。

这就是我所知道的hibernate中的缓存。

有人可以给我更多的细节吗?

顺便说一下,我不擅长sql/jdbc方面的工作,所以我想知道如何了解sql/jdbc以学习更多关于hibernate的知识(有什么文档吗?)?我不想仅仅成为一个hibernate用户,因为它只是一个工具,我想从这个精妙的框架中学到更多东西。 :)

2个回答

4

一级缓存

这个缓存默认是启用的。当NHibernate从数据库中通过唯一标识加载实体时,它会自动放入所谓的身份映射中,这个身份映射代表了一级缓存。

一级缓存的生命周期与当前会话相关联。一旦当前会话关闭,相应的一级缓存内容就会被清除。一旦一个实体在一级缓存中,当前会话内想要再次加载同一个实体的操作将从缓存中检索此实体,而不需要往返数据库。

这个实体映射背后的主要原因之一是为了避免两个不同的内存实例表示相同的数据库记录(或实体)的情况。

(摘自NH FAQ)

二级缓存

这个缓存位于单个会话范围缓存之上。使用此缓存可以避免许多往返数据库的操作,因为第一次在任何会话中加载确定的实体时,它将保留在缓存中,因此下一个请求(来自任何其他会话)将从缓存中获取它。

要使用L2 Cache,您需要一个缓存提供程序,例如SysCache或Memcache。这些缓存提供程序将缓存实体的值存储为由实体ID哈希的字符串数组。重要的是要注意,缓存的不是.NET对象,而只是它的值。

它被认为与会话工厂绑定,因为缓存将适用于由确定会话工厂创建的会话,因此由不同会话工厂创建的会话将不共享缓存。您清楚会话工厂的概念吗?

查询缓存

这个非常简单,但有一个陷阱。它将缓存查询及其参数,但不会缓存返回的实体。它只会缓存它们的ID,因此仅在L2缓存中才有意义,因为它包含与该ID相关联的值。

NHibernate关于缓存的FAQ条目:

https://web.archive.org/web/20110514214657/http://blogs.hibernatingrhinos.com/nhibernate/archive/2008/11/09/first-and-second-level-caching-in-nhibernate.aspx


谢谢,你的回答非常有用!我现在有点明白了。顺便问一下,有没有关于数据库方面的文档可以更多地了解Hibernate? - hguser
我建议您购买《Hibernate实战》:http://www.amazon.com/Hibernate-Action-Christian-Bauer/dp/193239415X - Pedro

0
对于L2缓存,具体有以下内容:
- 查询缓存 - 领域数据存储 - 基本缓存键元素 - 存储中的自然标识(通过@NaturalId注解) - 时间戳缓存

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接