在進行系統設計時,除了對安全、事務等問題給與足夠的重視外,效能也是乙個不可避免的問題所在,尤其是乙個b/s結構的軟體系統,必須充分地考慮訪問量、資料流量、伺服器負荷的問題。解決效能的瓶頸,除了對硬體系統進行公升級外,軟體設計的合理性尤為重要。
在前面我曾提到,分層式結構設計可能會在一定程度上影響資料訪問的效能,然而與它給設計人員帶來的好處相比,幾乎可以忽略。要提供整個系統的效能,還可以從資料庫的優化著手,例如連線池的使用、建立索引、優化查詢策略 等等,在petshop中就利用了資料庫的cache,對於資料量較大的訂單資料,則利用分庫的方式為其單獨建立了order和inventory資料庫。而在軟體設計上,比較有用的方式是利用多執行緒與非同步處理方式。
在petshop4.0中,使用了microsoft messaging queue(msmq)技術來完成非同步處理 ,利用訊息佇列臨時存放要插入的資料,使得資料訪問因為不需要訪問資料庫從而提高了訪問效能,至於佇列中的資料,則等待系統空閒的時候再進行處理,將其最終插入到資料庫中。
petshop4.0中的訊息處理,主要分為如下幾部分:訊息介面imessaging、訊息工廠messagingfactory、msmq實現msmqmessaging以及資料後台處理應用程式orderprocessor。
從模組化分上,petshop自始自終地履行了「面向介面設計」的原則,將訊息處理的介面與實現分開,並通過工廠模式封裝訊息實現物件的建立,以達到鬆散耦合的目的。
由於在petshop中僅對訂單的處理使用了非同步處理方式,因此在訊息介面imessaging中,僅定義了乙個iorder介面,其類圖如下:
在對訊息介面的實現中,考慮到未來的擴充套件中會有其他的資料物件會使用msmq,因此定義了乙個queue的基類,實現訊息receive和send的基本操作:
public virtual object receive()
catch (messagequeueexception mqex)
}public virtual void send(object msg)
其 中queue物件是system.messaging.messagequeue型別,作為存放資料的佇列。msmq佇列是乙個可持久的佇列,因此不必擔 心使用者不間斷地下訂單會導致訂單資料的丟失。在petshopqueue設定了timeout值,orderprocessor會根據timeout值定 期掃瞄佇列中的訂單資料。
msmqmessaging模組中,order物件實現了imessaging模組中定義的介面iorder,同時它還繼承了基類petshopqueue,其定義如下:
public class order:petshopqueue, petshop.imessaging.iorder
方法的實現**如下:
public new orderinfo receive()
public orderinfo receive(int timeout)
public void send(orderinfo ordermessage)
所以,最後的類圖應該如下:
注 意在order類的receive()方法中,是用new關鍵字而不是override關鍵字來重寫其父類petshopqueue的receive() 虛方法。因此,如果是例項化如下的物件,將會呼叫petshopqueue的receive()方法,而不是子類order的receive()方法:
petshopqueue queue = new order();
queue.receive();
從設計上來看,由於petshop採用「面向介面設計」的原則,如果我們要建立order物件,應該採用如下的方式:
iorder order = new order();
order.receive();
考慮到iorder的實現有可能的變化 ,petshop仍然利用了工廠模式,將iorder物件的建立用專門的工廠模組進行了封裝:
order order = new order();
while (true)
else
//update elapsed time
elapsedtime = new timespan(datetime.now.ticks).totalseconds - datetimestarting.totalseconds;
}catch (timeoutexception)
}//process the queued orders
for (int k = 0; k < queueorders.count; k++)
//batch complete or msmq receive timed out
ts.complete();
}console.writeline("(thread id " + thread.currentthread.managedthreadid + ") batch finished, " + processeditems + " items, in " + elapsedtime.tostring() + " seconds.");}}
首 先,它會通過petshop.bll.order類的公共方法receivefromqueue()來獲取訊息佇列中的訂單資料,並將其放入到乙個 arraylist物件中,然而再呼叫petshop.bll.order類的insert方法將其插入到order和inventory資料庫中。
在petshop.bll.order類中,並不是直接執行插入訂單的操作,而是呼叫了iorderstrategy介面的insert()方法:
public void insert(orderinfo order)
{// call credit card procesor
processcreditcard(order);
三 petshop4 0設計說明
petshop是乙個範例,微軟用它來展示.net企業系統開發的能力。業界有許多.net與j2ee之爭,許多資料是從微軟的petshop和sun的petstore而來。這種爭論不可避免帶有濃厚的商業色彩,對於我們開發人員而言,沒有必要過多關注。然而petshop隨著版本的不斷更新,至現在基於.net ...
PetShop 4 0 資料訪問層設計之我所見
個人感覺資料訪問層,設計上應該可以更精簡。現有的框架是乙個dal,對應乙個helper 我們可以理解其實就是真正的資料引擎 這種方式實現上確實很簡單,但是有重複的地方。對於每種dal,不同的只是helper,其它實現基本相同。乙個可行的重構,實現乙個真正的helper類,把不同的資料引擎,封裝為乙個...
PetShop學習記錄 資料庫訪問
背景知識 利用 反射代替new assembly.load 程式集 createinstance 命名空間.類 這裡的程式集讀取的是web層bin檔案下對應的dll,所以必須把對應的dll放入bin資料夾下 petshop例項 介面層訪問bll層,bll通過反射newiproduct物件,訪問sql...