利用Cache缓存数据DataTable数据提高大数据量访问性能-.NET教程,数据库应用
在數據量不大的情況下,程序怎么寫基本上性能差別不大,但是當我們面對數以萬計的數據的時候,我想性能就是個不得不考慮的問題了,每寫一個方法,每填充一 筆數據都要考慮到性能問題,否則服務器將承擔巨大的執行開銷,如果服務器性能不好可能立即就死在那里了,所以在大數據量頻繁訪問的頁面上,我們就必須考慮 如何提高頁面的性能了,本文將提供一種用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失效后第一次訪問頁面的那個用戶,不過這種犧牲換來別人的高性能也是值 得的嘛。
以上的文章我實在西部代碼發現的,我覺得很好就轉載過來了,我轉載的原因就是他的實現思路,我將在有時間的時候我進行 一下 重構!用在我目前的項目中去!嘎嘎 Monkey!!
總結
以上是生活随笔為你收集整理的利用Cache缓存数据DataTable数据提高大数据量访问性能-.NET教程,数据库应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Flex 4 NativeWindow
- 下一篇: php写二进制文件