我们有一个Web应用程序,它监听Web服务调用,构造查询,从数据库中提取数据并将结果发送回客户端。由于我们遇到了一些性能问题,我们希望在服务器端缓存数据。查询很复杂,涉及多个连接。数据库通过Web应用程序之外的另一个应用程序进行更新。我不认为我们可以使用EHCache,因为数据库没有通过同一个应用程序更新,并且查询参数经常变化。我们可以在这里采用哪些缓存策略来提高性能? 注意:优化查询以获得更好的性能。
答案 0 :(得分:1)
我认为我们不会使用EHCache,因为数据库没有通过同一个应用程序更新
如果您没有通过Hibernate的API,Hibernate将无法在需要时使无效相关的二级缓存区域。但您可以自己完成(请参阅evictXxx
上的各种SessionFactory
方法)。根据更新的频率,您可能仍然可以获益。
另请注意,EHCache只是一个二级缓存实现(无论您是否使用EHCache都不相关,它使用的是与问题相关的二级缓存)。
(...)并且查询参数经常变化。
那更烦人。使用查询缓存适用于频繁执行的查询(包括参数)。如果重新执行给定查询(包括参数)是不太可能发生的事件,则不会从查询缓存中获得太多好处。
在这种情况下,我可能会尝试使用Query#iterate()
代替Query#list()
。而后者将查询结果返回为List
,前者为:
根据需要初始化结果时返回的实体。 第一个SQL查询仅返回标识符。
这可能会提供更好的性能 IF 与ID对应的实体位于二级缓存中。如果不是,那就不会有更好的表现。
我们可以采用哪些缓存策略来改善性能?
我没有比上述建议更好的建议。缓存命中是可能的事件时缓存工作。
嗯......你的意思是什么? :)注意:优化查询以获得更好的性能。