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

标签 java hibernate jpa ehcache second-level-cache

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

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

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

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

最好的行动方案是什么?

我知道有查询缓存,但据我所知,第一次 every [externalId,subsidiaryId] 对仍然会丢失。

谢谢,有什么不明白的地方请追问

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

最佳答案

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

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

  • 如果ID不在缓存中,则执行查询,更新应用缓存,返回找到的实体
  • 如果ID在缓存中,则通过ID获取实体,进入二级缓存,避免命中DB

关于java - Hibernate 和 Ehcache - 如何确保每个 "select"都通过实体缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8127976/

相关文章:

mysql - Gradle/Hibernate/Maven 注释外键创建

mysql - (Hibernate,mysql)由: java. sql.SQLException引起:字段 'id'没有默认值

spring - 如何在 Spring Boot 应用程序中设置 Hibernate bulk_id_strategy?

java - JPA Criteria API 加入

java - hibernate/JPA : QueryException when hibernate generates metamodel for @ElementCollection

java - 如何将资源添加到jar文件中

java - 在随机位置用固定数量的宝藏填充二维字符数组

java - 从表中的其他下拉列表填充多个下拉列表

java - 是否可以计算 HTML 格式文件中可见文本的行数?

java - 跨越多个存储库的 Spring Data Transaction