我有一个用JPA表示的用户对象,它有特定的子类型。例如,想想User,然后是子类Admin和另一个子类Power User。
假设我有10万用户。我已经使用Ehcache成功实现了二级缓存,以提高性能并验证它是否正常工作。 http://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html#performance-cache
我知道它在调用load方法时确实有效(即,从缓存加载对象而不是调用sql查询)。我通过在hibernate级别登录并验证它更快来验证这一点。
但是,我实际上想要选择所有用户的子集...例如,假设我想计算有多少高级用户。
此外,我的用户有一个相关的ZipCode对象... ZipCode对象也是二级缓存...我想做的事实上是能够询问诸如...有多少高级用户在纽约州......
然而,我的问题是......我如何编写一个查询来执行此操作,这将达到二级缓存而不是数据库。请注意,我的二级缓存配置为可读/写...因此,当新用户添加到系统时,它们应自动添加到缓存...还...请注意我已经简要地调查了查询缓存但是我不确定它是否适用,因为这是针对多次运行的查询...我的问题更多的是......数据应该在二级缓存中,所以我必须做什么,以便我写查询时数据库没有被点击。
欢呼声, 布赖恩
答案 0 :(得分:0)
(...)无论如何数据都应该在二级缓存中,所以我必须这样做才能在编写查询时不会遇到数据库。
如果您的查询返回的实体已缓存,请查看Query#iterate()
。这将触发第一个查询以检索ID列表,然后触发每个ID的后续查询......这将打到L2缓存。