休眠和Ehcache-如何确保每个"select"都通过实体缓存?



我有一个实体(JPA注释与Hibernate查询接口),它有两个属性的复合业务键(一个external-id和一个subsidiary-id[这是一个外键])和一个主db键。

我有一个java多线程进程,它运行"相对于子公司",需要查询/更新/插入那些实体使用复合键(它得到那些external-ids的数据集)。

我可以保证,一旦这样的进程加载,没有其他进程会试图插入/更新/删除该子进程。

我想要的是在启动时加载该子公司的所有现有实体,然后对一对[externalId,subsidiaryId]的每个查询都要通过缓存,只有在没有通过db的情况下。如果进程中的一个线程插入了一个实体,我当然希望它被添加到缓存中。

最好的做法是什么?

我知道有查询缓存,但从我能收集到的,仍然会错过每一个 [externalId,subsidiaryId]对的第一次。

谢谢,如果有什么我不清楚的,请问我


我不得不停止调查这个问题,但现在我又回到了这个问题,我认为只有查询缓存和JB Nizet的答案是唯一适用的,这似乎是合理的。
我接受JB Nizet的答案,因为它很有趣,我可能会使用它(还不确定)。

我将为实体使用第二级缓存,在启动时查询所有子公司的实体(这将填充第二级缓存),并初始化一个应用程序缓存,该缓存仅将[externalId, subsidiaryId]映射到[id]

然后,每次搜索具有给定[externalId, subsidiaryId]的实体时,首先从应用程序缓存中获取其ID,然后

  • 如果ID不在缓存中,执行查询,更新应用程序缓存,并返回找到的实体
  • 如果ID在缓存中,则使用其ID获取实体,这将进入第二级缓存并避免撞击DB

最新更新