Hibernate和Ehcache-如何确保每个"选择"通过实体缓存?

时间:2011-11-14 20:55:02

标签: java hibernate jpa ehcache second-level-cache

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

我有一个JavaSE多线程进程,它运行“相对于一个子公司”,需要使用该组合密钥查询/更新/插入这些实体(它获取那些external-ids的数据集)。

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

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

什么是最好的行动方案?

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

谢谢,如果有任何我不清楚的地方,请询问

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

1 个答案:

答案 0 :(得分:2)

我会为实体使用二级缓存,在启动时查询所有补贴的实体(这将填充二级缓存),并初始化一个只将[externalId, subsidiaryId]映射到{的应用程序缓存{1}}。

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

  • 如果ID不在缓存中,请执行查询,更新应用程序缓存并返回找到的实体
  • 如果ID在缓存中,请使用其ID获取实体,该ID将转到二级缓存并避免命中数据库