好吧,我有一个非常复杂的Silverlight应用程序,它从一个WCF服务(asp.net托管的服务层)获取其数据,该服务又调用一个调用存储过程的数据层SQL 2005 DB来提取所需的数据。所以往返是这样的:WCF/Silverlight/SQL数据库缓存策略
Silverlight应用程序 - > WCF服务 - >数据层 - >数据库 - >数据层 - > WCF服务将数据实体转换为相应的DTO(数据传输对象)或List <> - > Silverlight App
大部分数据都是高度关联的(所以它需要存在于数据库中),但它很少会改变。看起来我有几个位置选择来缓存这个“半常数”数据:
- 我可以将其缓存在数据层中。我的数据层已经设置为使用SQLDependency类并缓存存储过程调用的结果。我认为这是或者可以是应用程序级缓存。
- 我可以缓存在WCF服务本身的应用程序级别(或会话级别取决于调用)缓存结果的DTO。 (a)我甚至可以进一步通过将得到的DTO的XML序列化为WCF服务端的文件,以便我可以(a)检查内存缓存,然后(b)检查文件缓存和(c)击中数据层
- 我可以在SL应用程序的客户端使用隔离存储来做类似于2(a)的操作。我可以使用散列(或者moddate或者其他)将数据序列化到本地隔离存储,然后只需拨打一个电话即可检查该数据。
还有一件事需要补充:我在IIS7中托管了这个WCF服务,并开启了动态压缩功能,以便(通常非常大且容易压缩的)XML响应得到gzip-ed。理想情况下,我想IIS会缓存这个gzip-ed结果以避免所有额外的处理。我认为它可能已经这样做了,但我不确定。
我很确定最终答案是“它取决于”的某种味道,但我很想听听别人如何接近这个。 Do X的一个好的战术方法,用工具Y测试性能,如果需要的话,做Z会很好。
几个环节(我会添加到这个,因为我研究这个):