缓存经常更改的查询

时间:2010-11-09 18:29:03

标签: hibernate caching ehcache

我们有一个Web应用程序,它监听Web服务调用,构造查询,从数据库中提取数据并将结果发送回客户端。由于我们遇到了一些性能问题,我们希望在服务器端缓存数据。查询很复杂,涉及多个连接。数据库通过Web应用程序之外的另一个应用程序进行更新。我不认为我们可以使用EHCache,因为数据库没有通过同一个应用程序更新,并且查询参数经常变化。我们可以在这里采用哪些缓存策略来提高性能? 注意:优化查询以获得更好的性能。

1 个答案:

答案 0 :(得分:1)

  

我认为我们不会使用EHCache,因为数据库没有通过同一个应用程序更新

如果您没有通过Hibernate的API,Hibernate将无法在需要时使无效相关的二级缓存区域。但您可以自己完成(请参阅evictXxx上的各种SessionFactory方法)。根据更新的频率,您可能仍然可以获益。

另请注意,EHCache只是一个二级缓存实现(无论您是否使用EHCache都不相关,它使用的是与问题相关的二级缓存)。

  

(...)并且查询参数经常变化。

那更烦人。使用查询缓存适用于频繁执行的查询(包括参数)。如果重新执行给定查询(包括参数)是不太可能发生的事件,则不会从查询缓存中获得太多好处。

在这种情况下,我可能会尝试使用Query#iterate()代替Query#list()。而后者将查询结果返回为List,前者为:

  

根据需要初始化结果时返回的实体。 第一个SQL查询仅返回标识符

这可能会提供更好的性能 IF 与ID对应的实体位于二级缓存中。如果不是,那就不会有更好的表现。

  

我们可以采用哪些缓存策略来改善性能?

我没有比上述建议更好的建议。缓存命中是可能的事件时缓存工作。

  

注意:优化查询以获得更好的性能。

嗯......你的意思是什么? :)