什么是hibernate缓存保存?

时间:2010-11-02 12:14:12

标签: hibernate caching jdbc

您好: 我对hibernate缓存缓存的内容感到困惑。

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

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

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

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

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

任何人都可以向我提供更多详情?

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

1 个答案:

答案 0 :(得分:4)

第一级缓存

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

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

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

(改编自NH FAQ)

二级缓存

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

要使用L2缓存,您需要一个缓存提供程序,例如SysCache或Memcache。这些人将把缓存实体的值存储为由实体的id散列的数组os字符串。重要的是要注意,它不是缓存的.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