【问题标题】:what does the hibernate cache save?休眠缓存保存了什么?
【发布时间】:2011-05-03 21:53:52
【问题描述】:

嗨: 我对休眠缓存所缓存的内容感到困惑。

从文档中,我知道休眠中有缓存类型。

一级:事务级。 好像是缓存了session要持久化的实体。

二级缓存:我真的不知道这个缓存,从api上说这个缓存工作在sessionfactory级别……我看不懂。

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

这就是我对休眠中缓存的了解。

谁能给我更多的细节?

顺便说一句,我不擅长 sql/jdbc 工作,所以我也想知道我应该如何了解 sql/jdbc 以了解有关 hibernate 的更多信息(任何文档?)?我不想只是一个休眠用户,因为它只是一个工具,我想要的是从这个美妙的框架中学到一些东西。 :)

【问题讨论】:

    标签: hibernate caching jdbc


    【解决方案1】:

    一级缓存

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

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

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

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

    二级缓存

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

    要使用 L2 缓存,您需要一个缓存提供程序,例如 SysCache 或 Memcache。这些家伙将缓存实体的值存储为由实体 id 散列的数组 os 字符串。请务必注意,缓存的不是 .net 对象,而是其值。

    据说是和会话工厂绑定的,因为缓存会对确定的会话工厂创建的会话起作用,所以不同会话工厂创建的会话不会共享缓存。您对会话工厂的概念清楚吗?

    查询缓存

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

    NHiernate 关于缓存的常见问题解答:

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

    【讨论】:

    猜你喜欢
    • 2011-03-12
    • 1970-01-01
    • 2016-08-13
    • 1970-01-01
    • 2011-12-16
    • 1970-01-01
    • 2012-04-29
    • 2015-01-05
    • 2011-11-18
    相关资源
    最近更新 更多