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

來源:互聯網
上載者:User
cache|訪問|緩衝|資料|效能 引言:
在資料量不大的情況下,程式怎麼寫基本上效能差別不大,但是當我們面對數以萬計的資料的時候,我想效能就是個不得不考慮的問題了,每寫一個方法,每填充一筆資料都要考慮到效能問題,否則伺服器將承擔巨大的執行開銷,如果伺服器效能不好可能立即就死在那裡了,所以在大資料量頻繁訪問的頁面上,我們就必須考慮如何提高頁面的效能了,本文將提供一種用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失效後第一次訪問頁面的那個使用者,不過這種犧牲換來別人的高效能也是值得的嘛。

相關文章

Cloud Intelligence Leading the Digital Future

Alibaba Cloud ACtivate Online Conference, Nov. 20th & 21st, 2019 (UTC+08)

Register Now >

Starter Package

SSD Cloud server and data transfer for only $2.50 a month

Get Started >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

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

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