你好:我对Hibernate缓存的内容感到困惑。
从文档中,我知道有几种类型的缓存在休眠。
一级:交易级。看起来要被会话持久化的实体被缓存在这里。
二级缓存:我真的不知道这个缓存,从API,它说这个缓存工作在会话工厂级别.我不明白。
查询缓存:这对我来说很容易理解(也许我错了)。它将查询参数沿着相关实体一起缓存。
这是我所知道的关于休眠中的该高速缓存的全部信息。
谁能给予我更多的细节?
顺便说一句,我不擅长sql/jdbc的工作,所以我也想知道我应该如何了解sql/jdbc,以了解更多关于休眠(任何文档?)我不想仅仅是一个休眠用户,因为它只是一个工具,我想要的是从这个美妙的框架中学习一些东西。:)
2条答案
按热度按时间unhi4e5o1#
一级缓存
默认情况下启用此缓存。当NHibernate从数据库中通过其唯一ID加载实体时,它会自动放入所谓的标识Map中。此标识Map表示第一级缓存。
第一级高速缓存的寿命与当前会话相关联。当前会话一关闭,相应的第一级缓存的内容就被清除。一旦实体位于第一级缓存中,想要在当前会话中加载完全相同的实体的后续操作就从该高速缓存中检索该实体,并且不需要到数据库的往返。
这种实体Map背后的主要原因之一是避免内存中的两个不同示例可以表示相同的数据库记录(或实体)的情况。
(来源于FAQ)
二级缓存
此缓存位于单会话作用域缓存之上。有了这个缓存,您可以保存许多到数据库的往返,因为任何会话中的任何人第一次加载确定的实体时,它会保留在该高速缓存中,因此下一个请求(来自任何其他会话)将从该高速缓存中获取它。
要使用二级缓存,您需要一个缓存提供程序,例如SysCache或Memcache。这些家伙将存储缓存实体的值作为一个数组os字符串哈希实体的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
au9on6nz2#
对于L2高速缓存,
@NaturalId
注解)