什么是hibernate缓存保存?

hgu*_*ser 6 caching hibernate jdbc

嗨:我对hibernate缓存缓存的内容感到困惑.

从文档中,我知道hibernate中存在缓存类型.

第一级:交易级别.似乎会话持久化的实体在此缓存.

二级缓存:我真的不知道这个缓存,从api,它说这个缓存工作在sessionfactory级别......我无法理解.

查询缓存:这对我来说很容易理解(也许我错了).它将查询参数与相关实体一起缓存.

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

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

顺便说一句,我不擅长sql/jdbc工作,所以我也想知道我应该怎么知道sql/jdbc来了解更多关于hibernate(任何文档?)的内容?我不想只是一个hibernate用户,因为它只是一个工具,我想要的是从这个精彩的框架中学到一些东西.:)

Ped*_*dro 4

一级缓存

默认情况下启用此缓存。当 NHibernate 通过数据库中唯一的 id 加载实体时,它会自动放入所谓的身份映射中。该标识映射代表第一级缓存。

一级缓存的生命周期与当前会话相关。当前会话关闭后,相应一级缓存的内容就会被清除。一旦实体位于第一级缓存中,想要在当前会话中加载完全相同的实体的后续操作就会从缓存中检索该实体,并且不需要往返数据库。

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

(改编自 NH 常见问题解答)

二级缓存

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

要使用 L2 缓存,您需要一个缓存提供程序,例如 SysCache 或 Memcache。这些人会将缓存实体的值存储为按实体 ID 散列的操作系统字符串数组。需要注意的是,缓存的不是 .net 对象,而是它的值。

据说它与会话工厂绑定在一起,因为缓存将对确定的会话工厂创建的会话起作用,因此不同会话工厂创建的会话不会共享缓存。您清楚会话工厂的概念吗?

查询缓存

这确实很简单,但有一个问题。它将缓存查询及其参数,但不会缓存返回的实体。它只会缓存它们的 Id,因此它仅对 L2 缓存有意义,因为它包含与该 Id 关联的值。

NHiernate关于缓存的FAQ条目:

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