一直以來,我都發現程式的運行速度不夠理想。通過查代碼,發現程式對資料庫的訪問非常頻繁,而且檢索出來的資料量比較大。為了讓程式運行快起來,我想對程式採用適當的緩衝方法。
我在C#嘗試了5種方法進行資料緩衝,具體如下:
(如有遺漏,錯誤歡迎大家指正,歡迎提建議。)
1:Session方法:此方法是針對於每個使用者來的,如果使用者量比較大,那麼建議不要採用此方法,否則會大量耗盡伺服器資源。
2:Cache方法:
2.1:對於每個使用者來說訪問的資料最好是一致的,否則要用不同的key標識不同的緩衝。 (要緩衝的資料至少也是按使用者類型來分的,如果每個使用者可以按條件檢索得到不同的資料的話,即使不造成資料混亂, 估計也跟session沒什麼區別了,使用者很多的話太耗伺服器資源)。
2.2:如果每個使用者得到的資料都不同,而且使用者數量較多,應該考慮往用戶端存了。
2.3:需要考慮當產生緩衝後,如果資料庫中的資料發生變化了。而造成使用者得不到最新的資料的問題。(可參考:"資料庫緩衝相關性"的文章)
3:往用戶端寫檔案
首先A頁面在啟動並執行時候,從資料庫中取到了資料集,在顯示出資料報表的同時,A頁面將資料集轉化為xml檔案,寫入用戶端。客戶如果要列印該報表,那麼程式就從用戶端取存入的xml檔案,如果xml檔案存在,就從中讀取資料並顯示成列印報表顯示出來。如果xml檔案不存在,就提示重新檢索資料。
例如:
<script type=text/javascript> //給客戶機上寫檔案
function ws()
{
var fso,ctf;
fso = new ActiveXObject("Scripting.FileSystemObject"); //IE的安全設定裡面需要把沒有標記為安全的ActiveX控制項和指令碼設定
為“啟用”,才不會提示。
ctf = fso.CreateTextFile("c:\\luiTestfile.txt",true);//true為可以覆蓋原有檔案
ctf.Write("write content in file");
ctf.Close();
}
</script>
但是,每次操作用戶端的檔案,系統都會提示是否運行沒有標識的ActiveX控制項,使用者點否就不能成功儲存檔案了。
4:用cookie來儲存
--------------------寫cookie----------------------------------------
HttpCookie myCookie = new HttpCookie("DateCookie_lui");//DateCookie_lui為要建立的cookie索引值對的鍵名。
DateTime now = DateTime.Now;
myCookie.Value = now.ToString();//給此cookie賦值
myCookie.Expires = now.AddMinutes(1);//設定cookie的到期日期和時間(此為1分鐘後到期),在客戶再次訪問服務 器同時附帶cookie檔案,如其中以這個名字的cookie到期,就會自動清除它。
this.Response.SetCookie(myCookie);//將此cookie寫入用戶端
--------------------讀cookie----------------------------------------
HttpCookie myCookie = new HttpCookie("myTestCookie_lui");//建立一個cookie操作對象
myCookie = Request.Cookies["DateCookie_lui"];//得到用戶端傳來的cookie資料,DateCookie_lui為要取的cookie索引值對的鍵名
if(myCookie != null)
Response.Write(" Cookie Name is:"+myCookie.Name+". Cookie Value is:"+myCookie.Value);
else
Response.Write(" Not found!");
用cookie的方法儲存資料,經過我反覆嘗試發現cookie儲存值的大小被限定,(每項僅可存漢字僅1686個,字母或數字僅5059個),且cookie檔案的大小一旦超過大小(20kb左右)就會導致找不到頁面的錯誤,且每個cookie檔案中只能存20項索引值對。
5:嘗試在A頁面把dataset轉化為xml字串,隱藏於頁面中,post提交到B頁面;在B頁面取到該xml字串,然後將xml字串轉化為dataset,產生報表。
將dataset轉化為xml的字串:
vDataXmlStr=ds.GetXml();//得到資料集的xml字串
this.hidXmlStr.Value=vDataXmlStr;//存入頁面的隱藏元素中
------------------------------------------------------------------------
將xml字串轉化為dataset:
vXmlStr = Request.Form["hidXmlStr"].ToString();//取xml字串的變數值
System.IO.StringReader vSR = new System.IO.StringReader(vXmlStr);//讀取字串
ds.ReadXml(vSR);//將xml讀入dataset中
------------------------------------------------------------
頁面中如果字型變成亂碼:要設定該頁面的<%@ Page responseEncoding="gb2312"%>