将JPA/Hibernate实体预加载到内存中的缓存

5us2dqdw  于 2022-11-14  发布在  其他
关注(0)|答案(1)|浏览(149)

在 工作 中 , 我们 使用 Java EE ( WildFly ) , 工作 负载 不断 增加 。 持久 层 使用 EJB 和 JPA 和 Hibernate 。 一 个 表 ( 主 数据 表 ) 获得 了 99% 的 流量 和 数据 库 大小 , 而 还有 一 堆 其他 的 表 用于 描述 数据 。
它 可以 工作 , 但 有时 速度 会 变 慢 , 因为 在 保存 数据 表 实体 时 必须 加载 许多 描述 实体 。 我们 似乎 无法 启动 第 二级 Hibernate 缓存 , 因此 我们 目前 正在 研究 内存 缓存 。
基本 思想 是 为 我 上面 提到 的 每个 描述 实体 创建 一 个 简单 的 HashMap , 我们 讨论 的 是 10 个 表 , 总共 有 5 万 条 记录 , 所以 不会 对 数据 库 造成 严重 影响 。
在 启动 时 加载 所有 这些 实体 , 将 它们 放到 HashMap 中 , 将 它们 与 其他 缓存 实体 链接 ( 一些 描述 实体 之间 有 关系 ) 。 当 其中 一 个 实体 更新 时 , 在 缓存 中 用 更新 的 版本 替换 它 。 当 它们 驻留 在 缓存 中 时 , 它们 被 逐出 , 并且 应该 像 正常 的 POJO 一样 工作 。
我们 还 研究 了 一些 真正 的 缓存 解决 方案 , 如 JCache 、 Caffeine 等 , 但 不 确定 我们 是否 真 的 需要 它们 提供 的 特性 。
这 一切 有 意义 吗 ? 或者 这 是 解决 问题 的 愚蠢 方法 ?

vof42yt1

vof42yt11#

Hibernate的二级缓存将处理所有这些问题。它将透明地将对象放入该高速缓存,并在(该应用程序的)某个事务更改数据时将其逐出。二级缓存是指在缓存中缓存实体对象。还有一个查询缓存,它使用二级缓存。注意,查询缓存需要在每个查询的基础上启用,尽管使用org.hibernate.query.Query#setCacheable

相关问题