什么是Hibernate的一级和二级caching?

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

1.1)一级caching

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

1.2)二级caching

二级caching总是与会话工厂对象关联。 在运行事务时,它会在Session Factory级别加载对象,以便这些对象可用于整个应用程序,而不会绑定到单个用户。 由于对象已经被加载到caching中,只要查询返回了对象,那么就不需要进行数据库事务。 这样二级caching就起作用了。 这里我们也可以使用查询级caching。

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

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

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

这里对hibernatecaching的一些基本的解释…

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

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

默认情况下,NHibernate使用基于会话对象的第一级caching。 但是如果您在多服务器环境中运行,那么一级caching可能不具有可扩展性以及一些性能问题。 发生这种情况的原因是,由于数据分布在多个服务器上,所以必须非常频繁地访问数据库。 换句话说,NHibernate提供了一个基本的,不太复杂的进程中的L1caching。 但是,它不提供caching解决scheme必须对应用程序性能产生显着影响的function。

所以所有这些问题的问题是使用与会话工厂对象关联的二级caching。 它减less了到数据库的时间消耗,最终增加了应用程序响应时间。

这是关于一级caching二级caching的很好的解释。 易于理解和相当好的解释。

一级caching

会话对象保存一级caching数据。 它是默认启用的。 一级caching数据将不可用于整个应用程序。 应用程序可以使用许多会话对象。

二级caching

SessionFactory对象保存二级caching数据。 存储在二级caching中的数据将可用于整个应用程序。 但是我们需要明确地启用它。

在二级caching中,域hbm文件可以是可变关键字,值为false。 例如,在这个领域类中,一天中的某些持续时间作为普遍的事实保持不变。 所以,它可以被标记为不可变的跨应用程序。