2012-02-16 79 views
1

我目前正在使用Oracle數據庫(使用EntitySpaces ORM)處理ASP.NET報告應用程序(C#)。性能/響應對於此應用程序的成功至關重要,因爲它將在幾天內被1000人使用。我非常想避免往返數據庫,因爲我知道這將是一個瓶頸。我的第一個想法(因爲數據庫的物理大小相對較小)只是將所有數據庫對象緩存在應用程序緩存中,並根據需要從緩存中查詢它們。當ASP.NET開始從緩存中刪除項目時,我很快意識到我的邏輯存在缺陷 - 可能是因爲正在使用太多的內存。在ASP.NET中存儲和訪問對象/集合的指導

是否有另一種/更好的方法來做到這一點?當應用程序啓動時,是否存在另一種存儲靜態集合的方法,我可以保證不會被垃圾回收佔用?我很瞭解頁面級別的緩存,但這並沒有多大幫助,因爲我基本上構建了一系列對每個用戶都是唯一的特別報告。

編輯:只是爲了進一步澄清,緩存的所有數據的大小是< 5 MB。這個想法是緩存所有的對象,然後用linq過濾集合。

+0

你在做任何數據分頁?允許人們放置過濾器?我們在說多少行?不管你選擇什麼方法,都有權衡。有些選擇以內存爲代價提供性能,其他則以犧牲磁盤空間爲代價提供性能。請記住,取決於您的應用程序池設置(在X時間或X內存或X CPU之後回收),整個應用程序池可能會重複使用刪除所有緩存項目,導致緩存應用程序內存無用。 – 2012-02-17 04:24:25

+0

您可以使用一些外部緩存服務器,如NOSQL dbs。這是相當容易實現的,它不需要太多的代碼改變。他們中的很多是免費和開源的。如果您對這些選項感興趣,請告訴我,我可以將您指向幾個網站。 – ASetty 2012-02-17 07:36:21

+0

我在上面稍微澄清了這個問題。最新的想法是繼續使用應用程序緩存,但使用CacheItemPriority.NotRemovable選項。 – 2012-02-17 16:59:22

回答

0

正如我已經確定你知道,索引是一個好主意。之後,服務器的硬件將極大地影響數據庫提供數據的能力 - >如果您真的需要一些認真的性能,請切換到RAID磁盤陣列,每晚備份到普通HD。

除此之外,表格的設計會影響其速度。既然你注意到數據庫是相當小的(這需要合格,因爲甲骨文通常用於更大的東西),那裏可能沒有太多要做。

如果您確實需要速度,您可能希望使用多宿主網卡,並直接連接到請求數據的服務器。

看到,關於RDBMS,將​​內容保存在內存中並不是一個好主意,因爲它支持在性能上將數據提交到磁盤。如果您不介意數據可能丟失的想法(沒有做任何真正重要的事情或需要備份),那麼您可以使用僅限內存的數據庫。而且你建立的任何數據庫機器都應該與處理器和內存一起打包(不用拼湊)。

作爲一般規則,更多的性能可以通過更緊密/更手動的編碼和異國情調的硬件來實現,但問題是,它是否值得這個價格?獲得額外10%性能所需的資源類似於保時捷活塞與大衆活塞的附加精度所需的資源 - >它將比以前的數量增加10倍,以獲得該性能。我知道的唯一一個擁有這種資金並且需要這種表現的人(我的頭頂)爲國家政府的密碼部門或高頻交易公司工作。

0

根據數據的大小,你需要存儲,你可以把它存儲在應用程序狀態:

如何:在應用程序狀態保存價值http://msdn.microsoft.com/en-us/library/94xkskdf.aspx

如何從應用程序狀態http://msdn.microsoft.com/en-us/library/y8hhek39.aspx讀取值

最後,您可以設置在Application_Start方法中的變量在應用程序的Global.asax文件:http://www.techrepublic.com/article/working-with-the-aspnet-globalasax-file/5771721

+1

使用Application Start查找和存儲數據時請認真思考。請記住,在提供第一個請求之前,執行所有這些查找操作時,應用程序將掛起第一個請求。這可以爲您的應用程序添加新的應用程序池。更好的方法可能是根據需要將項目添加到緩存中,或者使用HTTP緩存並啓用到期日期,以便將項目保留在內存中,並且如果X分鐘後尚未使用它們,則將它們過期(滑動到期)。 – 2012-02-17 04:32:48