Hibernate缓存和数据库一致性

时间:2015-06-22 11:48:43

标签: java database hibernate caching orm

我有一个关于Hibernate缓存的问题。

我所理解的是Hibernate缓存用于避免频繁访问数据库。因此我们使用Hibernate缓存机制 获得表现。

如果将新记录添加到数据库中,使用缓存时,如果我们没有访问数据库,那么新添加的记录将如何获取?

缓存仍然可以获取旧记录吗?有人可以解释我这是如何工作的?

3 个答案:

答案 0 :(得分:1)

每个缓存并发策略都有一个关联的cache synchronization mehcanism

  1. NONSTRICT_READ_WRITE是一个直读缓存,因为实体在从数据库中提取时存储在缓存中(而不是在持久化时)。更新实体会导致实体缓存条目失效。

  2. READ_WRITE是一种异步直写缓存策略,因为数据库和缓存不会以事务方式更新。软锁用于保证一致性。

  3. TRANSACTIONAL是一种同步缓存策略,因为数据库和缓存都是原子更新的。

  4. Hibernate支持强一致性,因此READ_WRITE和TRANSACTIONAL缓存一致性与READ_COMMITTED isolation level类似。在NONSTRICT_READ_WRITE中,过时的记录仍然可以发生。

答案 1 :(得分:0)

  

Cache是一个存储数据的组件,以便将来对该数据的请求   可以更快地送达;存储在缓存中的数据可能是结果   较早的计算,或其他地方存储的数据的重复。   当在缓存中找到请求的数据时,会发生缓存命中,   如果不能,则会发生缓存未命中

  

为了避免频繁命中数据库,我们使用hibernate   缓存机制以获得性能。

真。

  

如果我们已经将新记录添加到数据库中,则使用缓存   不要打数据库,新添加的记录将如何   取?

如果缓存命中,我们不会点击数据库,但如果缓存未命中,则必须从数据库中提取值。

初始化时,缓存为空。无论何时第一次访问记录,它都不会在缓存中。如果您访问记录,则首先在缓存中检查该记录,因为缓存为空,将发生缓存未命中。由于缓存未命中,将从数据库中获取记录。从数据库中获取的记录放在缓存中,以便下次访问记录缓存时发生命中,并且不访问数据库。

请注意,缓存中可存储的数据/记录数量有限。利用可用的有限存储,缓存主要使用最近最少使用的算法来从缓存中删除最近最少使用或最早访问的记录。因此,即使您之前可能已经访问过某条记录,也可能会从缓存(缓存未命中)中逐出。需要数据库命中才能再次获取该记录。是的,该记录将再次添加到数据库中。

答案 2 :(得分:0)

&#34;如果将新记录添加到数据库中,使用缓存时,如果我们没有访问数据库,那么新添加的记录将如何获取?&#34; < / em>的

我们将在数据库中找到新记录,因为它不会在缓存中。然后它存储在缓存中,随时可以在后续请求中提供服务。

&#34;缓存仍然可以获取旧记录吗?&#34;

如果您的意思是更新行时会发生什么,那么Hibernate也会更新缓存中的行(反汇编实体)或使其无效(取决于群集环境中的缓存并发策略和缓存拓扑)。

但是,如果在数据库中通过另一个应用程序更新了行而没有Hibernate意识到这一点,那么你是对的,过时的数据将从缓存中提供(直到过时的条目过期或从缓存中逐出)。