ehcache查询缓存未命中后禁用数据库往返?
问题描述:
我使用hibernate + ehcache和正确配置的缓存属性。在应用程序启动时,我们初始化缓存并通过ORM向DB发起可能的查询全部。 如果出现“有效参数组合”,则此功能非常有效 - 否则会导致缓存未命中并因此导致数据库往返。数据纯粹是静态的。ehcache查询缓存未命中后禁用数据库往返?
70%的所有情况都是错过的,所以如果缓存未命中可以通过查询/实体级别进行不同对待,我们可以获得很多收益。
是否有办法阻止hibernate + ehcache进入数据库,如果在热身后发生缓存未命中? hibernate中可能有一个API钩子?
在理想的情况下,缓存预热后根本不会执行数据库访问。
TIA
弗兰克
答
考虑您的配置考虑,你有几种选择:
- 终止的Ehcache水平
- 终止休眠水平
- 终止在JDBC级别
免责声明:下面提到的都不是完整的解决方案 - 事实上,它们可能是不可实施的。但我会从那里开始挖掘。
我不认为可以在Ehcache级别上做太多的工作,因为如果元素不存在,缓存层简单地返回null
,Hibernate取回控制并从数据库中获取条目。你可能返回一些预定义的值(你知道这是无效的,意味着缺席),但这是一种代码味道。
在休眠级别,您可以定义一个对LoadEvent
有反应的interceptor。不知道这是否可以应用于查询。
与休眠类似,您可以使用JDBC interceptor。这可能不是理想的,因为你仍然会有Hibernate开销,但是这比等待数据库往返行程(我想每个请求约50毫秒)要好得多。
是的,得出了相同的结论,我同意Hibernate应该可能用于完成所需的行为。我瞄了一眼休眠Java文档和我的感觉我不得不面对: * ** ** SingletonEhCacheProvider ...为切入点,以高速缓存ORM水暖 * QueryKey * StandardQueryCache * StandardQueryCacheFactory * Hibernate拦截器(不知道我在这方面可以从中获得什么,将会看到) – user1477398 2013-03-26 09:23:06