2012-03-23 75 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