1

我使用 hibernate + ehcache 和正确配置的缓存属性。在应用程序启动时,我们启动缓存并通过 ORM 向 DB触发所有可能的查询。如果出现“有效的参数组合”,这将非常有效 - 否则会导致缓存未命中,从而导致数据库往返。数据是纯静态的。

70% 的情况是未命中,因此如果缓存未命中可以在查询/实体级别上得到不同的处理,我们可以获得很多。

如果在预热后发生缓存未命中,有没有办法阻止休眠 + ehcache 进入数据库?休眠中是否有API挂钩?

在理想情况下,缓存预热后根本不执行任何数据库访问。

TIA

坦率

4

1 回答 1

0

考虑到您的配置,您有几个选择:

  • 在 Ehcache 级别终止
  • 在休眠级别终止
  • 在 JDBC 级别终止

免责声明:下面提到的都不是完整的解决方案——事实上,它们可能无法实现。但我会从那里开始挖掘。

我不认为在 Ehcache 级别可以做很多事情,因为如果元素不存在,缓存层会简单地返回null,Hibernate 会收回控制权并从数据库中获取条目。你可以返回一些预定义的值(你知道它是无效的并且意味着不存在),但这有点代码味道。

在 Hibernate 级别,您可以定义一个拦截器来响应LoadEvent. 不确定这是否可以应用于查询。

与 Hibernate 类似,您可以使用JDBC 拦截器。这可能并不理想,因为您仍然会有 Hibernate 开销,但这仍然比等待数据库往返要好得多(我想每个请求大约 50 毫秒?)。

于 2013-03-25T10:44:45.527 回答