2012-03-23 91 views
0

我们在我们的Web应用程序中生成报告,方法是查询我们的sql服务器以xml形式返回的数据,然后使用xslt处理以​​创建最终输出。 为了加速系统,我们从返回的sql xml中移除了所有的静态信息,并缓存了一个包含所有静态信息的大型XDocument。在执行xsl转换之前,我们将带有静态信息的XDocument附加到来自sql server的xml的末尾。静态XDocument约为50Meg,需要几秒钟才能从sql server中构建。为asp.net网站缓存大对象

我们的问题是,一旦我们开始缓存这些大型XDoc中的一些,我们就达到了缓存专用字节的限制大小,并清除了缓存。在人们运行报表时重建这些XDocuments太耗时。我还没有尝试将这些XDoc保存到物理文件中,因为它们对于每天持续发生的每个报告运行都是必需的。

我想过安装AppFabric Cache,但我不确定将5到10个这样的大项存储在它里面是个好主意。

任何想法?如果我在Web服务器上安装更多的内存,它是否会自动提供给asp.net用于更大的缓存?我已经尝试过在将数据存储在缓存中之前对数据进行压缩(缩小5倍),但解压缩数据并重新解析XDocument会减慢服务器的速度。

+0

为什么不在数据库上使用简单的自定义缓存?或者将它们保存为磁盘上的文件(更好),并使用处理程序将这些文件从用户下载。 – Aristos 2012-03-24 00:32:33

+0

@Aristos用户不会下载静态数据,它将与来自sql server的xml相结合,然后通过xslt进行处理以创建报告输出。我可以将数据保存在磁盘上,但是我需要通过XDocument.Load()为每个报告加载它。认为必须有更快的方式。 – Wavel 2012-03-24 18:02:52

+1

使用真正的快速序列化类,如http://code.google.com/p/protobuf-net/ – Aristos 2012-03-24 18:07:27

回答

0

最后,将它保存到一个文件中,然后重新加载它,因为它的全部准备好序列化。

protobuf网是超快速和轻,我已经测试和使用它,但它没有任何好处,因为它的所有准备序列化。

+0

刚刚听到从马克格雷维尔说,谁protobuf网不是一个很好的解决方案序列化的XML,因为它将它作为一个字符串存储起来。基本上,没有比XDocument.Save()更好。 – Wavel 2012-03-26 19:52:15

+0

@Wavel哦,你有权利,它的所有准备好的XML,我没有想到....嗯我改变了答案。 – Aristos 2012-03-26 21:03:12

0

可以使用varbinary(max)以二进制格式序列化xml对象并将其存储在数据库中。不确定其性能,但可能值得尝试一下,因为实现它不需要很长时间。

您可能想要解决的其他问题是访问报告的第一个用户的性能损失。为了避免这种情况,您可以预先生成报告,以便将它们缓存给每个人。

+0

如果我将xml序列化到sql服务器上,然后我回到原来的位置,返回的xml中包含用户数据和静态数据。我无法预先生成报告,因为它们是由用户设计的临时报告。用户数据也在不断变化。 – Wavel 2012-03-24 18:05:23

+0

我弄错了,我认为报告类型有限,每个人都得到相同的,这就是为什么你想使用缓存 – 2012-03-24 19:25:01