2010-11-02 100 views
5

嗨: 我很困惑什么是缓存的休眠缓存。休眠缓存保存什么?

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

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

二级缓存:我真的不知道这个缓存,从api,它说这个缓存工作在sessionfactory级别...我不明白。

查询缓存:这很容易理解我(也许我错了)。它缓存查询参数以及相关的实体。

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

任何人都可以给我更多的细节?

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

回答

3

一级缓存

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

第一级缓存的生命期与当前会话耦合。一旦当前会话关闭,相应第一级缓存的内容将被清除。一旦一个实体处于第一级缓存中,想要加载当前会话中相同实体的后续操作将从缓存中检索此实体,并且不需要往返数据库。

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

(改编自NH FAQ)

二级缓存

这缓存是单个会话范围缓存上方。有了这个缓存,您可以节省很多往返数据库的时间,因为任何会话中的任何人第一次加载确定的实体时,它将保留在缓存中,所以下一个请求(来自任何其他会话)将从缓存中获取它。

要使用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

+0

谢谢你,你的答案是相当有用!我现在有点清楚。顺便说一句,关于数据库相关的任何文档知道更多关于休眠? – hguser 2010-11-02 12:54:52

+0

我建议你购买Hibernate In Action:http://www.amazon.com/Hibernate-Action-Christian-Bauer/dp/193239415X – Pedro 2010-11-02 13:09:13