2010-11-10 97 views
1

我有JPA具有特定子类型中表示的用户对象。例如,考虑User,然后是子类Admin,以及另一个子类Power User。优化在第二级缓存休眠/ jpa大选择

比方说,我有100K用户。我已经使用Ehcache成功实现了二级缓存,以提高性能并验证它正在工作。 http://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html#performance-cache

我知道它在您调用load方法时可以工作(即,您从缓存中加载对象而不是调用sql查询)。我通过在休眠级别进行日志记录验证了这一点,并验证了它更快。

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

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

但是,我的问题是...我如何写一个查询来做到这一点,将达到二级缓存,而不是数据库。请注意,我的第二级缓存被配置为可读/写...因此,当新用户被添加到系统中时,他们应该被自动添加到缓存中......还有......请注意,我已经简要地调查了Query缓存,但是我不确定这适用于多次运行的查询......我的问题更多的是......数据应该在二级缓存中,所以我必须做些什么以便当我编写我的查询时数据库不会被击中。

欢呼声, 布赖恩

回答

0

(...)的数据应该在二级缓存反正所以我有什么做的,这样,当我写我的查询数据库没有遭到袭击。

如果您的查询返回的实体缓存,看看Query#iterate()。这将触发第一个查询来检索ID列表,然后对每个ID进行后续查询......这将会触及L2缓存。

+0

嗨帕斯卡,你似乎是休眠/ jpa大师:)谢谢你回答我的问题。不幸的是我使用JPA 1.0,所以我想知道是否有任何方法在javax.persistence.Query https://glassfish.dev.java.net/nonav/javaee5/api/index.html?javax/persistence/package -summary.html调用相同的东西?再次感谢。 Brian – Brian 2010-11-10 15:55:35

+0

@Brian事实上,我建议在这里使用Hibernate的'Query',JPA没有与我所建议的相同的东西。 – 2010-11-10 16:03:24

+0

感谢那个帕斯卡。出于兴趣,是否还有其他替代方法,或者这是您唯一知道的方法?非常感谢你的帮助。 – Brian 2010-11-10 16:14:49