什么是Hibernate的一级和二级缓存?

任何人都可以用简单的语言解释Hibernate中的第一级和第二级缓存是什么?


1.1)一级缓存

一级缓存始终与Session对象关联。 Hibernate默认使用这个缓存。 在这里,它处理一个接一个的事务,意味着不会多次处理一个事务。 它主要减少了在给定事务中需要生成的SQL查询的数量。 这不是在事务完成每次修改之后更新,而是仅在事务结束时更新事务。

1.2)二级缓存

二级缓存总是与Session Factory对象关联。 在运行事务时,它在两者之间加载会话工厂级别的对象,以便这些对象可供整个应用程序使用,而不会绑定到单个用户。 由于对象已经被加载到缓存中,所以无论何时查询返回对象,此时都不需要进行数据库事务。 这样二级缓存就可以工作。 这里我们也可以使用查询级缓存。

引自:http://javabeat.net/introduction-to-hibernate-caching/


Streamline Logic博客上的一级缓存有很好的解释。

基本上,第一级缓存发生在每个会话基础上,因为第二级缓存可以在多个会话中共享。


这里有一些关于休眠缓存的基本解释...

一级缓存与“会话”对象关联。 缓存对象的范围是会话。 一旦会话关闭,缓存的对象就会永远消失。 一级缓存默认启用,您无法禁用它。 当我们第一次查询实体时,它会从数据库中检索并存储在与休眠会话相关的第一级高速缓存中。 如果我们用相同的会话对象再次查询同一个对象,它将从缓存中加载并且不会执行sql查询。 使用evict()方法可以从会话中删除加载的实体。 如果使用evict()方法删除了该实体,则该实体的下一次加载将再次进行数据库调用。 整个会话缓存可以使用clear()方法删除。 它将删除存储在缓存中的所有实体。

二级缓存与一级缓存分开,可以在会话工厂范围内全局使用。 二级缓存是在会话工厂作用域中创建的,并可用于使用该特定会话工厂创建的所有会话中。 这也意味着,一旦会话工厂关闭,与其关联的所有高速缓存都将关闭,并且高速缓存管理器也会关闭。 每当hibernate会话尝试加载一个实体时,它首先在第一级缓存中查找实体的缓存副本(与特定的休眠会话相关联)。 如果实体的缓存副本存在于第一级缓存中,则它将作为加载方法的结果返回。 如果一级缓存中没有缓存实体,则查找缓存实体的二级缓存。 如果第二级缓存具有缓存实体,则它将作为加载方法的结果返回。 但是,在返回实体之前,它也存储在一级缓存中,以便实体的下一次调用load方法将从一级缓存本身返回实体,并且不需要再次转到二级缓存。 如果在第一级缓存和第二级缓存中也找不到实体,则执行数据库查询并将实体存储在两个缓存级别中,然后作为load()方法的响应返回。

链接地址: http://www.djcxy.com/p/71049.html

上一篇: What are First and Second Level caching in Hibernate?

下一篇: NHibernate.MappingException: No persister for: XYZ