利用Cache快取資料DataTable資料提高大資料量訪問效能

來源:互聯網
上載者:User
在資料量不大的情況下,程式怎麼寫基本上效能差別不大,但是當我們面對數以萬計的資料的時候,我想效能就是個不得不考慮的問題了,每寫一個方法,每填充一筆資料都要考慮到效能問題,否則伺服器將承擔巨大的執行開銷,如果伺服器效能不好可能立即就死在那裡了,所以在大資料量頻繁訪問的頁面上,我們就必須考慮如何提高頁面的效能了,本文將提供一種用cache提高訪問效能的方法來解決此問題,在很大程度上提高頁面載入資料的效能。本文列舉的是論壇版塊中貼文清單頁面載入資料的執行個體。

本文:

每個版塊貼文清單資訊都會對應一個cache的名字,比如,我們可以按照規律設成

#region -- CacheName Setting --

boardCacheName = "Board" + boardID.ToString();

#endregion

這裡我們同樣是採取資料集填充DataTable的方法建立資料的。不過,因為我們有了cache,所以,我們在第一次載入完資料後,會把資料壓到cache中,然後每次填充DataTable前進行判斷,如果cache為空白時才載入,如果不為空白,則不載入。

private DataTable BuildDataTable()

{

     // 資料緩衝 機制

       if(Cache[boardCacheName] != null)

       {

              // Create DataTable From Cache

              DataTable dt = (DataTable)Cache[boardCacheName];

              return dt;

       }

       else

       {

              // Create DataTable From DataBase

              DataTable dt = new DataTable();

 

              #region -- Create DataTable --

              dt.Columns.Add("TopicID", System.Type.GetType("System.Int32"));

              //省去N個類似欄位的添加

              dt.Columns.Add("CoolState", System.Type.GetType("System.Int32"));

              DataColumn[] keys = new DataColumn[1];

              keys[0] = dt.Columns[0];

              dt.PrimaryKey = keys;

              #endregion

 

              #region -- Add DataRow --

              BBSTopicCollection btc = new BBSTopicCollection();

              btc.BoardID = this.boardID;

              btc.TopicState = 1;

              if(!btc.GetInfo())

              {

                     return dt;

              }

              for(int i=0;i<btc.Count;i++)

              {

                     DataRow dr = dt.NewRow();

                     // 帖ID

                     dr["TopicID"] = btc[i].ID;

                     //省去N個類似欄位的資料賦值

                     // Cool State

                     dr["CoolState"] = btc[i].CoolState;

                     dt.Rows.Add(dr);

              }

              #endregion

 

              // Push DataTable To Cache

              Cache[boardCacheName] = dt;

              return dt;

       }

}

 

上面的程式碼完成了資料填充過程,但更重要的是對資料進行管理,比如,我們改變一條住處的某些狀態位來實現一些功能,比如,我們把貼子加成“酷貼”,這個時候就要對cache進行操作,特別注意一下,我們在上面的代碼中還特別設定topicID這一列作為表的主值鍵,這樣我們才能很快的定位到要管理的資料資訊,方法如下。

#region -- Cache Management --

if(Cache["Board" + this.boardID.ToString()] != null)

{

       DataTable dt = (DataTable)Cache["Board" + this.boardID.ToString()];

       DataRow dr = dt.Rows.Find(topicID);

       if(dr != null)

       {

              dr["CoolState"] = 1;

              dr.AcceptChanges();

              dt.AcceptChanges();

       }

}

#endregion

 

一點說明:其中的topicID是通過某種途徑傳過來的你想操作的資訊的唯一識別欄位,AcceptChanges方法更新儲存相應對象資料自上一次更新以來所有的更改,另外對cache進行操作後,記得要重新綁定資料,另外也要同時更新資料庫中的,本文認為讀者具備對資料庫資料進行操作的能力,便不作贅述。

那麼我們如何來刪除資料記錄呢?我們是不是可以直接在找到dr的那一行下面,用個

dr.Delete()來把資料刪除就完事了呢?答案是否,這樣操作會出現問題,經測試對cache的添加和更新操作會立即生效,但刪除某條記錄的動作不會立即起作用,這樣就會導致資料操作非同步性,這是不可以的,同時1.1版本比1.0版本要稍微好一些,但還是解決不了非同步性的問題,所以我們是不是必須把cache幹掉,重新填充一下呢,如果你願意這樣做,自然也無可厚非,我這裡提供另外一個思路供參考。

我們的解決方案是,在建立表格的時候多加一個刪除標誌位,比如DeleteState,當初從資料庫中載入出來的時候都一律為1,然後經過刪除操作以後,將這條資訊的刪除標誌位置0(不要忘記同時操作資料庫中的資料),然後綁定的時候對DataView進行過濾,dv.RowFilter = "DeleteState==1",便可以類比出刪除效果了。

資料經過這樣的處理之後,訪問效能會數以百倍的提高,資料只在cache失效後才會重新載入,使用者對資料的訪問都是對cache的操作,而且cache是伺服器變數,對所有使用者共用,這樣,如果同時有一百個使用者訪問,也都是對同一個cache進行一百次訪問,而程式訪問cache是非常快的,如果不使用cache,那麼,我們就要去跑一百次資料庫操作,效能極差,尤其是當海量使用者對海量資料進行訪問的時候,伺服器可謂苦不堪言,所以用cache來緩解負荷是相當必要且相對優良的一種方案,只是辛苦了那位在cache失效後第一次訪問頁面的那個使用者,不過這種犧牲換來別人的高效能也是值得的嘛。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.