大型XML文件的体系结构和缓存注意事项

时间:2008-12-13 21:36:45

标签: xml architecture caching data-layers

我正在建立一个网站来展示产品和产品类别。数据来自500k XML文件形式的外部服务。该网站是ASP.NET,C#。

XML的结构是一个类别列表。每个类别中可能包含一些产品和/或更多类别。

显然,我们无法调用此外部服务来获取每个页面请求的大型XML文件,因此我们每隔几个小时调用一次并缓存它。我需要做这样的事情:

  • 在页面左侧显示产品类别菜单
  • 显示所选类别中的所有产品
  • 显示单个产品的扩展信息

我的问题如下:

首先,在显示“DVD”类别中所有产品的页面上,假设我执行以下操作(在页面加载时):

XDocument allCategories = Cache["CategoriesXml"];
// loop through the XML and find the DVD category
// Get all products under it, then display them

通过将类别XML引入本地变量(请记住,它是500k),这是服务器上的耗尽吗?请记住,每次加载页面时我都必须这样做。可能有成千上万的人同时查看不同的页面。如果有几千人在几秒钟的时间内加载同一页面,我会在内存中挂出一千个这个XML文件的实例吗?或者垃圾收集器会为我管理所有这些吗?

直接循环缓存项目是否更好,或者性能较差(和/或不良做法)?

其次,我说我缓存了整个XML文件。我通过循环来获取该XML的产品或类别(我使用LINQ over XML)。创建Category类型和Product类型,将它们放入数组并缓存它会更好吗?然后遍历Category对象和数组而不是XDocument?什么会更高效?

第三,关于如何构建这个系统,你会说什么是最好的做法。假设我有一个数据访问层,一个Business Objects层和一个Web应用程序。我应该在哪里放置对外部服务的引用,以检索XML?我应该缓存哪一层?此应用程序是否甚至具有数据访问层,在某种意义上DAL部分是由其他系统完成的?目前我的DAL仅用于访问我们的数据库,并且将web服务引用放在那里感觉不对 - 但可能不是吗?在Business层中使用缓存是不好的做法(即干扰单元测试等)?我考虑过网络和业务层之间的中间层,仅用于缓存 - 这是一个好主意还是坏主意?

我已经完成了这个网站的大部分内容,实际上 - 我现在只是回顾它并想知道我是否以最好的方式完成它,所以想要将你的建议与我实际完成的工作进行比较,并希望我将能够回去改进它。

谢谢!

1 个答案:

答案 0 :(得分:3)

我已经做了类似的事情,我会把你的缓存逻辑放在数据层中。这将从您的业务和表示层中删除所有缓存逻辑。

我不熟悉ASP.NET,但我的猜测是肯定的,每个页面请求都会导致XMl文件被单独加载。

我不会将XML存储在内存中。您应该将所需的数据存储在内存中。可能有ASP.NET库用于使用内存缓存,如Memcached,您可以在其中存储对象的序列化版本。