【问题标题】:Disable database roundtrip after ehcache query cache miss?ehcache 查询缓存未命中后禁用数据库往返?
【发布时间】:2013-03-25 18:44:45
【问题描述】:

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

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

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

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

TIA

弗兰克

【问题讨论】:

    标签: database hibernate ehcache roundtrip


    【解决方案1】:

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

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

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

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

    在休眠级别,您可以定义一个interceptor,它将对LoadEvent 作出反应。不确定这是否可以应用于查询。

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

    【讨论】:

    • 是的,得出了相同的结论,我同意应该使用 Hibernate 来完成所需的行为。我浏览了 hibernate java 文档,我认为我必须处理: * SingletonEhCacheProvider ...作为缓存管道的入口点 * QueryKey * StandardQueryCache * StandardQueryCacheFactory * Hibernate Interceptors (还不知道在这方面我能从他们那里得到什么,会看到)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    • 1970-01-01
    • 2011-08-02
    • 2019-05-12
    • 1970-01-01
    相关资源
    最近更新 更多