【问题标题】:optimizing large selects in hibernate/jpa with 2nd level cache使用二级缓存优化 hibernate/jpa 中的大型选择
【发布时间】:2011-05-07 22:52:53
【问题描述】:

我有一个用 JPA 表示的用户对象,它具有特定的子类型。例如,想想 User,然后是子类 Admin,以及另一个子类 Power User。

假设我有 10 万用户。我已经使用 Ehcache 成功实现了二级缓存,以提高性能并验证它是否正常工作。 http://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html#performance-cache

我知道当您调用 load 方法时它确实有效(即,您从缓存中加载对象而不是调用 sql 查询)。我已经通过休眠级别的日志验证了这一点,并验证了它是否更快。

但是,我实际上想选择所有用户的子集...例如,假设我想计算有多少高级用户。

此外,我的用户有一个关联的 ZipCode 对象...ZipCode 对象也是二级缓存...我想要做的实际上是能够询问诸如...我有多少高级用户在纽约州...

但是,我的问题是...我如何编写一个查询来执行此操作,该查询将访问二级缓存而不是数据库。请注意,我的二级缓存配置为读/写...因此,当新用户添加到系统时,它们应该自动添加到缓存中...另外...请注意,我已经简要调查了查询缓存,但是我不确定它是否适用,因为这适用于多次运行的查询……我的问题更多的是……数据无论如何都应该在二级缓存中,所以我该怎么做才能使当我编写查询时,数据库没有被命中。

干杯, 布赖恩

【问题讨论】:

    标签: performance hibernate jpa second-level-cache


    【解决方案1】:

    (...) 无论如何,数据都应该在二级缓存中,所以我该怎么做才能在我编写查询时不会命中数据库。

    如果您的查询返回的实体被缓存,请查看Query#iterate()。这将触发第一个查询以检索 ID 列表,然后触发每个 ID 的后续查询......这将命中 L2 缓存。

    【讨论】:

    • 嗨 Pascal,您似乎是 hibernate/jpa 大师 :) 感谢您回答我的问题。不幸的是,我使用的是 JPA 1.0,所以我想知道您是否知道 javax.persistence.Query glassfish.dev.java.net/nonav/javaee5/api/index.html?javax/… 上的任何方法调用相同的东西?再次感谢。布赖恩
    • @Brian 实际上,我在这里建议使用 Hibernate 的 Query,JPA 没有我建议的等效项。
    • 感谢帕斯卡。只是出于兴趣,是否还有其他替代方法,或者这是您唯一知道的方法?感谢您的帮助。
    • @Brian:好吧,既然查询缓存在这里没有帮助(因为参数正在改变),这是我能想到的唯一解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    • 2015-05-14
    相关资源
    最近更新 更多