Hibernate缓存与数据库一致性

3

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

据我所知,Hibernate缓存用于避免频繁访问数据库。因此,我们使用Hibernate缓存机制来提高性能。

如果向数据库添加了新记录,在使用缓存时,如果不访问数据库,那么新添加的记录将如何被获取?

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

3个回答

1
每种缓存并发策略都有一个相关的缓存同步机制
  1. NONSTRICT_READ_WRITE是一种读取时缓存,因为实体在从数据库获取时存储在缓存中(而不是在持久化时)。更新实体会导致实体缓存条目失效。

  2. READ_WRITE是一种异步写入缓存策略,因为数据库和缓存不是事务性更新。使用软锁来保证一致性。

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

Hibernate倾向于强一致性,因此READ_WRITE和TRANSACTIONAL缓存的一致性类似于 READ_COMMITTED隔离级别。在NONSTRICT_READ_WRITE中,仍然可能会出现过期记录。


0
缓存是一个组件,它存储数据,以便将来对该数据的请求可以更快地被服务; 存储在缓存中的数据可能是先前计算的结果,也可能是存储在其他地方的数据的副本。当所请求的数据可以在缓存中找到时,发生缓存命中,而当无法找到时则发生缓存未命中

.

为了避免频繁访问数据库,我们使用Hibernate缓存机制来提高性能。
是的。
如果数据库中添加了新记录,有了缓存,如果我们不访问数据库,那么新添加的记录将如何被获取?
在缓存命中的情况下,我们不会访问数据库,但是如果出现缓存未命中,值必须从数据库中获取。
在初始化时,缓存为空。每当您第一次访问记录时,它不会在缓存中。如果您访问记录,则首先检查缓存中的记录,由于缓存为空,将发生缓存未命中。由于缓存未命中,记录将从数据库中获取。从数据库中获取的记录被放入缓存中,以便下次访问该记录时,缓存命中并且不访问数据库。
请注意,缓存中可以存储的数据/记录数量是有限制的。由于可用存储空间有限,缓存通常使用最近最少使用算法从缓存中删除最近最少使用或最早访问的记录。因此,即使您之前访问过某个记录,它也可能已经从缓存中清除(缓存未命中)。需要进行数据库查询才能再次获取该记录。是的,该记录将再次添加到数据库中。

0

如果在使用缓存时向数据库添加了新记录,如果我们不访问数据库,那么如何获取新添加的记录?

我们将访问数据库以获取新记录,因为它不会在缓存中。然后将其存储在缓存中,并准备在随后的请求中从缓存中提供服务。

缓存仍然获取旧记录,对吗?

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

但是,如果通过另一个应用程序在数据库中更新了该行而Hibernate不知道,则您是正确的,将从缓存中提供陈旧的数据(直到陈旧条目过期或从缓存中逐出为止)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接