2011-06-08 79 views
5

我將在我運行的網站上爲捐款頁做一個進度條。我只希望進度條每天更新一次,而不是像通常那樣每次進行頁面加載。c#/ ASP.NET/SQL Server - 每天運行一次查詢

我有什麼選擇來抓取當前的捐款總額,並將其放在一個扁平的文本文件中,以供aspx頁面讀取,而不是每次查詢數據庫。

希望這是有道理的。

回答

3

另一種選擇是使用緩存並將緩存設置爲每24小時僅過期一次。然後將數據拉出並放入緩存中,並且緩存的版本全天提供。

1

我只是每次在數據庫上運行SUM查詢。除非你預計每天會有數百萬行插入,否則這將是一次可忽略的性能下降。 (提供您的數據庫表的索引)

+0

的一點是,他們不希望值來更新不斷更新。他們只想每天更新一次值。 – 2011-06-08 15:55:01

+1

然後修改你的查詢,只在給定的日期時間之前包括交易:) – DaveRead 2011-06-08 15:56:05

+0

是的 - 如果他在相關表格中包含創建日期列(以及爲什麼你不會 - 我的所有表都有),這是微不足道的。 – 2011-06-08 15:57:57

0

如果您想每天運行一次,Task Scheduler是您最好的選擇。讓它運行查詢並將結果粘貼到您的網站可以讀取的某處。

下一個選項是使用緩存。讓代碼檢查值是否在緩存中。如果是,請使用它。如果不是,請運行查詢並填充緩存。將緩存設置爲24小時後過期。問題在於,查詢可能會在一個繁忙的網站上運行多次(在緩存過期之後但在第一次請求再次填充之前有多個請求進入),但是對於查詢而言可能並不重要花很長時間。

1

爲什麼不實施Cache並使其在24小時內過期?這是一個更好的解決方案,並且有助於表現太:-)

HTH

1

第一:這種類型的查詢是非常快的;除非你有一些你沒有提到的理由,否則只要每次加載時都讓頁面查詢數據庫。現在很多人似乎都主張避免往返數據庫。但是,SQL Server很快就會,而這種事情對你的應用程序性能幾乎沒有影響。此外,我很樂意儘可能地顯示準確的數據,而不是可能24小時過時的數據。

如果你堅持這樣做,你有幾個選擇。

  1. 創建VBScript或(首選)PowerShell腳本查詢數據庫和轉儲結果,比方說,在連接到你的網站上的虛擬文件夾的ASPX,ASCX或HTML文件。將腳本設置爲在您的Web服務器上(或腳本服務器,如果有的話)作爲計劃任務運行。

  2. 對Windows服務做同樣的事情。這可能是矯枉過正的。當你需要一些東西來監聽遠程連接等時,服​​務是非常棒的,但是爲了定期運行一個任務,內置的調度器工作得很好。

您生成的文件應該可能已經包含格式化的HTML。您的ASP.NET頁面將包含此用戶控件或部分視圖。如果您使用的是MVC,則可以使用腳本中的Razor來格式化輸出。

再次,我認爲這是一個壞主意,並且創造不必要的工作。除非你避免碰到數據庫有一個很好的理由,否則不要走這條道路。

0
  • 嘗試搜索ASP.NET全局緩存示例。設置兩個變量,一個用於查詢結果,另一個用於查詢執行的DateTime。檢查代碼是否DateTime.Now - 在高速緩存中的日期爲> 24小時 - >再次更新(或類似的東西)

  • 如果你有一些類的靜態變量,它是在整個Web應用程序可見

0

我會說要使用緩存。作爲對其他緩存答案的改進,您可以使用一些代碼來實現緩存,使緩存每天在同一時間過期,而不是在第一次訪問後的24小時後過期。這可以防止在流量不穩定的情況下出現不穩定的更新時間。中斷後的第一個請求將查找該值,並將其持續到下一個截止時間。但是無論第一次請求發生在何時,截止保持不變。

沿着這個東西線:

int ProgressValue 
    { 
     get 
     { 
      int? Value = Cache["ProgressValue"] as int?; 
      if (Value == null) 
      { 
       //Set expiration time to 6 AM tomorrow. 
       DateTime ExpTime = DateTime.Now.Date.AddDays(1).AddHours(6); 
       Value = GetValueFromDB(); 
       Cache.Insert("ProgressValue", Value, null, ExpTime, System.Web.Caching.Cache.NoSlidingExpiration); 
      } 
      return (int)Value; 
     } 
    }