请考虑以下情况。
db中有一个表,其内容一起形成一个存储库。该表将很少更新(更新现有的实体,添加新实体或删除实体)。 所以目前我使用的方法是创建一个单独的XXXRepository pojo,它将从XXX表读取所有行(实体)并将它们存储在地图中。
如果有人正在更新XXX表,那么在执行更新部分代码之后,将运行post runnable,这将清除存储库(map),因此下次从地图中找到任何实体时,loadRepository将是调用(因为地图将为null)。
这是我目前处理存储库缓存的方式,我可以在应用程序生命周期中使用它。
JPA / Hibernate是否提供/支持任何标准方式来实现/实现此要求。
我经历了缓存机制(第一级和第二级缓存)。但它似乎是针对实体或查询或数据以及用于不同目的/方法而不是预期由Repository发生或实现的内容。 此外,如果我们能够通过使用二级缓存以某种方式实现这一点,那么还有一个问题是仅在jpa操作和jpql查询的情况下缓存更新。在jdbc或本机查询的情况下,它将无法更新,我们将有陈旧的数据(如果我错了,请纠正我)。
请在这方面帮助我,因为jpa的标准方法是什么。
答案 0 :(得分:1)
如果所有实体都可以毫无问题地保存在内存中,那么二级缓存很容易解决问题。每次要从其中几个实体读取数据时,您只需执行获取所有实体的请求,并使用Java过滤结果。
如果这个唯一的“fetch all”请求缓存在二级缓存中,那么它将始终从内存中返回实体,除非执行更新(在这种情况下,二级缓存将丢弃其缓存值) 。您还应将实体本身放在二级缓存中,并确保此实体的缓存能够容纳所有实体。这样,session.get调用以及与此实体的关系导航也将使用二级缓存。
显然,您已重新实现了二级缓存为您所做的工作。
无论解决方案是什么,如果某些进程更新了Hibernate背后的数据,就不可能避免返回过时的数据。您要么接受这个事实(并调整缓存的生存时间以限制陈旧性),要么您不接受它,除了每次需要数据时查询数据库别无选择。