我使用hibernate + ehcache和正确配置的缓存属性。在应用程序启动时,我们启动缓存并通过ORM向数据库发送所有可能的查询。 如果出现“有效参数组合”,这种方法非常有效 - 否则会导致高速缓存未命中,从而导致数据库往返。数据纯粹是静态的。
所有案例中有70%是未命中的,因此如果在查询/实体级别上可以区别对待缓存未命中,我们可以获得很多收益。
如果在预热后发生缓存未命中,有没有办法阻止hibernate + ehcache进入数据库?在hibernate中可能有一个API挂钩吗?
在理想情况下,在缓存预热后根本不会执行数据库访问。
TIA
弗兰克
答案 0 :(得分:0)
考虑到您的配置,您有以下几种选择:
免责声明:以下两者都不是完整的解决方案 - 事实上,它们可能无法实现。但我会从那里开始挖掘。
我不认为在Ehcache级别可以做很多事情,因为如果元素不存在,缓存层只返回null
并且Hibernate收回控件并从数据库中获取条目。你可以返回一些预先定义的值(你知道它是无效的并且意味着缺席),但这有点代码味道。
在Hibernate级别,您可以定义interceptor,它会对LoadEvent
作出反应。不确定这是否可以应用于查询。
与Hibernate类似,你可以使用JDBC interceptor。它可能不太理想,因为你仍然会有Hibernate开销,但这仍然比等待数据库往返要好得多(我假设每个请求约50毫秒?)。