在ehcache查询缓存未命中后禁用数据库往返?

时间:2013-03-23 22:57:51

标签: database hibernate ehcache roundtrip

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

所有案例中有70%是未命中的,因此如果在查询/实体级别上可以区别对待缓存未命中,我们可以获得很多收益。

如果在预热后发生缓存未命中,有没有办法阻止hibernate + ehcache进入数据库?在hibernate中可能有一个API挂钩吗?

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

TIA

弗兰克

1 个答案:

答案 0 :(得分:0)

考虑到您的配置,您有以下几种选择:

  • 终止于Ehcache级别
  • 终止于Hibernate级别
  • 终止于JDBC级别

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

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

在Hibernate级别,您可以定义interceptor,它会对LoadEvent作出反应。不确定这是否可以应用于查询。

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