WEB用戶端累加式更新資料解決方案

來源:互聯網
上載者:User
web|解決|用戶端|資料 本文屬spanzhang原創,其blog地址為:http://blog.csdn.net/spanzhang。引用或轉貼請註明出處,謝謝!!



以展現資料為主要任務的網頁,如股票類的網頁,多希望能即時展現資料庫裡的資料。流行的解決方案是將資料做成xml格式,瀏覽器隔一段時間取一次該xml資料,然後更新到網頁上。一種是使用Microsoft.XMLHTTP來從伺服器上GET資料,另一種是用MSXML2.DOMDocument來load伺服器上的資料。這兩種方法都差不多,都是走的XML路線。【孟子E章】對這種模式寫過很多文章,這裡就不討論了。我這裡重點在於闡述資料的累加式更新過程。

假設我們的資料是一個二維的關係資料,並且每一行都有一個主鍵唯一標示。WEB伺服器在Application_Start裡開始一個伺服器時鐘(System.Timers.Timer),每隔一段時間更新一次資料。伺服器提供給用戶端的xml資料包含兩個檔案,一個是目前的版本的所有資料(all.aspx),另一個是目前的版本和上一版本的增量資料(delta.aspx)。原始碼如下:
all.aspx檔案:
<%@ Page language="c#" %>
<%
Response.Expires = 0;
Response.ContentType = "text/xml";
Response.Charset = "UTF-8";
%>
<%
System.Data.DataTable dt = sm_web.Logic.dt_all;
%>
<r v="<%=sm_web.Logic.dataVersion%>"><%
if(dt != null)
{
for(int i=0;i<dt.Rows.Count;i++)
{
%><p a="<%=dt.Rows[i]["a"]%>" b="<%=dt.Rows[i]["b"]%>" c="<%=dt.Rows[i]["c"]%>" d="<%=dt.Rows[i]["d"]%>"/><%
}
}
%></r>

其中,sm_web.Logic.dt_all和sm_web.Logic.dataVersion均為靜態變數。所產生的xml資料樣本如下:
<r v=“1052“>
<p a=“0“ b=“1002“ c=“98.48“ d=“湖南“/>
<p a=“0“ b=“1003“ c=“26.37“ d=“上海“/>
</r>

delta.aspx檔案:
<%@ Page language="c#" %>
<%
Response.Expires = 0;
Response.ContentType = "text/xml";
Response.Charset = "UTF-8";
%><r v="<%=sm_web.Logic.dataVersion%>"><%=sm_web.Logic.changedXml%></r>
其中,sm_web.Logic.changedXml為靜態變數。所產生的xml資料樣本如下:
<r v=“1052“>
<p a=“1“ b=“1002“ d=“廣州“/>
<p a=“1“ b=“1003“ c=“25.00“/>
</r>

這裡,a是一個標記欄位,用來表明對一行資料所做的更新類型,分別為:0:無;1:修改;2:刪除;3:增加。xml全部採用屬性的方式來表示資料是為了減少網路傳輸量,因為a=““比<a></a>少3個字元。

伺服器時鐘每步進一次將做如下處理:
1、取得當前的所有資料;
2、和以前的資料比較,裝配出變化資料sm_web.Logic.changedXml;
3、更新sm_web.Logic.dt_all為當前的資料;
4、sm_web.Logic.dataVersion增加1。

整個伺服器端的處理過程就是這樣了。而在用戶端,頁面第一次裝載的時候同步下載all.aspx內容,並初始化所有的頁面元素(包括一個用戶端資料版本號碼)並開啟一個時鐘以小於伺服器端時鐘步進速度的一半還要小一點點的速度步進(至於為什麼,後面作討論)。每次時鐘步進時需要做如下幾個步驟:
1、停止時鐘步進;
2、非同步下載delta.aspx;

當delta.aspx下載完成後,判斷新資料的版本號碼:
1、如果和當前用戶端資料版本號碼相同,則啟動時鐘並返回;
2、如果版本號碼比當前用戶端資料版本號碼+1還要大(版本號碼斷裂),則重新同步裝載all.aspx,更新完資料後啟動時鐘;
3、否則對增量資料做處理,更新網頁局部元素。

上面的操作放在一個try塊裡面,完成後重新啟動用戶端的時鐘。對於伺服器端的時鐘更新速度和用戶端的時鐘更新速度,需要很仔細的去設定。由於用戶端在版本號碼斷裂的情況下需要重新載入全部資料,通常不要將用戶端的時間設定得太長,至少要比伺服器端時鐘的一半還要小一點(考慮網路延遲)。但也不能過於小了以至於用戶端失去了和使用者互動的時間。在我的一個應用中,伺服器端時鐘更新速度為4秒,用戶端更新速度為1秒,可以保證不會出現版本號碼斷裂的情況。

至此,全部技術架構介紹完畢,如果需要更多的細節,請發評論或給我發mail。




相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

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 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。