freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

petshop的系統(tǒng)架構(gòu)設(shè)計(jì)-在線瀏覽

2024-08-09 18:28本頁(yè)面
  

【正文】 重新編譯的程序集xcopy到部署的服務(wù)器上即可。我曾經(jīng)在一個(gè)項(xiàng)目中,利用一個(gè)專門的表來(lái)存放SQL語(yǔ)句。這種做法近似于存儲(chǔ)過(guò)程的調(diào)用,但卻避免了部署上的問(wèn)題。它僅適合于SQL語(yǔ)句較少的場(chǎng)景。同樣的道理,這些SQL語(yǔ)句也可以存放到XML文件中,更有利于系統(tǒng)的擴(kuò)展或修改。SQL語(yǔ)句的使用無(wú)法避免,如何更好的應(yīng)用SQL語(yǔ)句也無(wú)定論,但有一個(gè)原則值得我們遵守,就是“應(yīng)該盡量讓SQL語(yǔ)句盡存在于數(shù)據(jù)訪問(wèn)層的具體實(shí)現(xiàn)中”。因?yàn)镺RM框架已經(jīng)為數(shù)據(jù)訪問(wèn)提供了基本的Select,Insert,Update和Delete操作了。 ISession s = ()。 ITransaction trans = null。 trytrans = ()。( order)。()。 } { 此外,這樣的設(shè)計(jì),也是與數(shù)據(jù)庫(kù)無(wú)關(guān)的,NHibernate可以通過(guò)Dialect(方言)的機(jī)制支持不同的數(shù)據(jù)庫(kù)。當(dāng)然,ORM框架并非是萬(wàn)能的,面對(duì)紛繁復(fù)雜的業(yè)務(wù)邏輯,它并不能完全消滅SQL語(yǔ)句,以及替代復(fù)雜的數(shù)據(jù)庫(kù)訪問(wèn)邏輯,但它卻很好的體現(xiàn)了“80/20(或90/10)法則”(也被稱為“帕累托法則”),也就是說(shuō):花比較少(10%20%)的力氣就可以解決大部分(80%90%)的問(wèn)題,而要解決剩下的少部分問(wèn)題則需要多得多的努力。這無(wú)疑縮短了整個(gè)項(xiàng)目開(kāi)發(fā)的周期?,F(xiàn)在我們已經(jīng)有了數(shù)據(jù)實(shí)體,數(shù)據(jù)對(duì)象的抽象接口和實(shí)現(xiàn),可以說(shuō)有關(guān)數(shù)據(jù)庫(kù)訪問(wèn)的主體就已經(jīng)完成了。在前面的設(shè)計(jì)中,這些對(duì)象已經(jīng)被抽象為對(duì)應(yīng)的接口,而其實(shí)現(xiàn)則根據(jù)數(shù)據(jù)庫(kù)的不同而有所不同。而上面所述的兩個(gè)問(wèn)題,也都可以通過(guò)抽象工廠模式來(lái)解決。例如,創(chuàng)建SQL Server的Order對(duì)象如下:PetShopFactory factory = new SQLServerFactory()。要考慮到數(shù)據(jù)庫(kù)的可移植性,則factory必須作為一個(gè)全局變量,并在主程序運(yùn)行時(shí)被實(shí)例化。一旦整個(gè)系統(tǒng)要求支持Oracle,那么還需要修改這行代碼為:PetShopFactory factory = new OracleFactory()。解決的辦法是“依賴注入”。不過(guò),在PetShop系統(tǒng)中,并不需要專門的容器來(lái)實(shí)現(xiàn)“依賴注入”,簡(jiǎn)單的做法還是利用配置文件和反射功能來(lái)實(shí)現(xiàn)。然而,當(dāng)我們利用配置文件和反射功能時(shí),具體工廠的創(chuàng)建就顯得有些“畫蛇添足”了,我們完全可以在配置文件中,直接指向具體的數(shù)據(jù)庫(kù)對(duì)象實(shí)現(xiàn)類。DataAccess類完全取代了前面創(chuàng)建的工廠類體系,它是一個(gè)sealed類,其中創(chuàng)建各種數(shù)據(jù)對(duì)象的方法,均為靜態(tài)方法。// Look up the DAL implementation we should be using{ string className = orderPath + “.Order”。這些實(shí)現(xiàn)邏輯散布于整個(gè)PetShop系統(tǒng)中,在我看來(lái),是可以在此基礎(chǔ)上進(jìn)行重構(gòu)的。private static readonly string dalPath = [”WebDAL”]。 private static readonly string orderPath = [”O(jiān)rdersDAL”]。//……{string fullPath = dalPath + “.” + className。{string fullPath = orderPath + “.” + className。{string fullPath = orderStategyPath + “.” + className。//……}那么和所謂“依賴注入”相關(guān)的代碼都可以利用ServiceLocator來(lái)完成。public static CreateOrder() PetShop數(shù)據(jù)訪問(wèn)層之消息處理PetShop數(shù)據(jù)訪問(wèn)層之消息處理Filed under: Design amp。 在進(jìn)行系統(tǒng)設(shè)計(jì)時(shí),除了對(duì)安全、事務(wù)等問(wèn)題給與足夠的重視外,性能也是一個(gè)不可避免的問(wèn)題所在,尤其是一個(gè)B/S結(jié)構(gòu)的軟件系統(tǒng),必須充分地考慮訪問(wèn)量、數(shù)據(jù)流量、服務(wù)器負(fù)荷的問(wèn)題。要提供整個(gè)系統(tǒng)的性能,還可以從數(shù)據(jù)庫(kù)的優(yōu)化著手,例如連接池的使用、建立索引、優(yōu)化查詢策略等等,例如在PetShop中就利用了數(shù)據(jù)庫(kù)的Cache,對(duì)于數(shù)據(jù)量較大的訂單數(shù)據(jù),則利用分庫(kù)的方式為其單獨(dú)建立了Order和Inventory數(shù)據(jù)庫(kù)。從模塊化分上,PetShop自始自終地履行了“面向接口設(shè)計(jì)”的原則,將消息處理的接口與實(shí)現(xiàn)分開(kāi),并通過(guò)工廠模式封裝消息實(shí)現(xiàn)對(duì)象的創(chuàng)建,以達(dá)到松散耦合的目的。 由于在PetShop中僅對(duì)訂單的處理使用了異步處理方式,因此在消息接口IMessaging中,僅定義了一個(gè)IOrder接口,其類圖如下: try { catch (MessageQueueException mqex) { (msg, transactionType)。 ,作為存放數(shù)據(jù)的隊(duì)列。在PetShopQueue設(shè)置了timeout值,OrderProcessor會(huì)根據(jù)timeout值定期掃描隊(duì)列中的訂單數(shù)據(jù)。 MSMQMessaging模塊中,Order對(duì)象實(shí)現(xiàn)了IMessaging模塊中定義的接口IOrder,同時(shí)它還繼承了基類PetShopQueue,其定義如下: 方法的實(shí)現(xiàn)代碼如下: { = 。 return (OrderInfo)((Message)()).Body。 } public OrderInfo Receive(int timeout) = ((timeout))。 return Receive()。 } { = 。 (orderMessage)。 }因此,如果是實(shí)例化如下的對(duì)象,將會(huì)調(diào)用PetShopQueue的Receive()方法,而不是子類Order的Receive()方法: IOrder order = new Order()。 ()。 考慮到IOrder的實(shí)現(xiàn)有可能的變化,PetShop仍然利用了工廠模式,將IOrder對(duì)象的創(chuàng)建用專門的工廠模塊進(jìn)行了封裝: 在類QueueAccess中,通過(guò)CreateOrder()方法利用反射技術(shù)創(chuàng)建正確的IOrder類型對(duì)象: { path的值通過(guò)配置文件獲取: add key=”O(jiān)rderMessaging” value=””/ (order)。 }}例如定義一個(gè)實(shí)現(xiàn)IOrder接口的SpecialOrder,則可以新增一個(gè)模塊,而類名則仍然為Order,那么此時(shí)我們僅需要修改配置文件中OrderMessaging的值即可: OrderProcessor是一個(gè)控制臺(tái)應(yīng)用程序,不過(guò)可以根據(jù)需求將其設(shè)計(jì)為Windows Service。它利用了多線程技術(shù),以達(dá)到提高系統(tǒng)性能的目的。 在OrderProcessor應(yīng)用程序中,主函數(shù)Main用于控制線程,而核心的執(zhí)行任務(wù)則由方法ProcessOrders()實(shí)現(xiàn): { TimeSpan tsTimeout = ((transactionTimeout * batchSize))。 Order order = new Order()。 while (true) // queue timeout variables { for (int j = 0。 j++) try //only receive more queued orders if there is enough time { else j = batchSize。 } elapsedTime = new TimeSpan().TotalSeconds 。 } { j = batchSize。 } //process the queued orders k 。 { //batch plete or MSMQ receive timed out ((Thread Id + + ) batch finished, + processedItems + items, in + () + seconds.)。 } 首先,()來(lái)獲取消息隊(duì)列中的訂單數(shù)據(jù),并將其放入到一個(gè)ArrayList對(duì)象中。 ,并不是直接執(zhí)行插入訂單的操作,而是調(diào)用了IOrderStrategy接口的Insert()方法:public void Insert(OrderInfo order){ ProcessCreditCard(order)。 // Insert the order (a)synchrounously based on configuration}private static LoadInsertStrategy(){ string path = [”O(jiān)rderStrategyAssembly”]。 string className = [”O(jiān)rderStrategyClass”]。 // Using the evidence given in the config file load the appropriate assembly and class}add key=”O(jiān)rderStrategyAssembly” value=”” / 分布式處理中,一個(gè)重要的技術(shù)要素就是有關(guān)消息的處理,已經(jīng)提供了Message類,可以用于承載消息的傳遞,前提上消息的發(fā)送方與接收方在數(shù)據(jù)定義上應(yīng)有統(tǒng)一的接口規(guī)范。 MSMQ在分布式處理的運(yùn)用,在我參與的項(xiàng)目中已經(jīng)有了實(shí)現(xiàn)。由于分銷商管理系統(tǒng)(DMS)采用的是C/S結(jié)構(gòu),數(shù)據(jù)庫(kù)為SQL Server,而汽車制造商管理中心的EBS數(shù)據(jù)庫(kù)為Oracle。然后利用IBM的EAI技術(shù)(企業(yè)應(yīng)用集成,Enterprise Application Itegration)定期將文件服務(wù)器中的文件,利用接口規(guī)范寫入到EAI數(shù)據(jù)庫(kù)服務(wù)器中,并最終寫道EBS的Oracle數(shù)據(jù)庫(kù)中。 上述架構(gòu)是一個(gè)典型的分布式處理結(jié)構(gòu),而技術(shù)實(shí)現(xiàn)的核心就是MSMQ和EAI。 Filed under: Design amp。在CPU以及主板的芯片中,都引入了這種名為高速緩沖存儲(chǔ)器(Cache)的技術(shù)。硬件系統(tǒng)可以利用Cache存儲(chǔ)CPU訪問(wèn)概率高的那些數(shù)據(jù),當(dāng)CPU需要訪問(wèn)這些數(shù)據(jù)時(shí),可以直接從Cache中讀取,而不必訪問(wèn)存取速度相對(duì)較慢的內(nèi)存,從而提高了CPU的工作效率。緩存機(jī)制正是解決這一缺陷的加速器。 。另外一種緩存機(jī)制是頁(yè)輸出緩存,利用它,可以直接獲取存放在緩存中的頁(yè)面,而不需要經(jīng)過(guò)繁雜的對(duì)該頁(yè)面的再次處理。放入緩存中的應(yīng)用程序數(shù)據(jù)對(duì)象,以鍵/值對(duì)的方式存儲(chǔ),這便于用戶在訪問(wèn)緩存中的數(shù)據(jù)項(xiàng)時(shí),可以根據(jù)key值判斷該項(xiàng)是否存在緩存中。例如當(dāng)數(shù)據(jù)項(xiàng)無(wú)效、過(guò)期或內(nèi)存不足時(shí)移除它們。 Framework中。對(duì)于每一個(gè)應(yīng)用程序域,都要?jiǎng)?chuàng)建一個(gè)Cache類的實(shí)例,其生命周期與應(yīng)用程序域的生命周期保持一致。(”Second”, “Second Item”)。(”Third”, “Third Item”,new (null, dependencies))。但我們也可以通過(guò)代碼編寫的方式顯式的移除相關(guān)的數(shù)據(jù)項(xiàng):(”First”)。當(dāng)客戶端再一次訪問(wèn)該頁(yè)面時(shí),可以省去頁(yè)面處理的過(guò)程,從而提高頁(yè)面訪問(wèn)的性能,以及Web服務(wù)器的吞吐量。此時(shí),利用頁(yè)輸出緩存就可以將第一次搜索得到的查詢結(jié)果頁(yè)存儲(chǔ)在緩存中。頁(yè)輸出緩存分為整頁(yè)緩存和部分頁(yè)緩存。它主要包含兩個(gè)參數(shù):Duration和VaryByParam。如下的設(shè)置表示緩存在60秒內(nèi)有效: % OutputCache Duration=“60“ VaryByParam=“none“ %只要沒(méi)有超過(guò)Duration設(shè)置的期限值,當(dāng)用戶訪問(wèn)相同的頁(yè)面或控件時(shí),就可以直接在緩存中獲取。例如在一個(gè)輸出天氣預(yù)報(bào)結(jié)果的頁(yè)面中,如果需要為一個(gè)ID為txtCity的TextBox控件建立緩存,其值將顯示某城市的氣溫,那么我們可以進(jìn)行如下的設(shè)置: % OutputCache Duration=”60” VaryByParam=”txtCity” %如此一來(lái),只有輸入的值與緩存值相同,才從緩存中取出相應(yīng)的值。利用緩存的機(jī)制對(duì)性能的提升非常明顯。引入緩存看來(lái)是提高性能的“完美”解決方案,然而“金無(wú)足赤,人無(wú)完人”,緩存機(jī)制也有缺點(diǎn),那就是數(shù)據(jù)過(guò)期的問(wèn)題。我們可以想一想股票系統(tǒng)利用緩存所帶來(lái)的災(zāi)難,當(dāng)你利用錯(cuò)誤過(guò)期的數(shù)據(jù)去分析股市的風(fēng)云變幻時(shí),你會(huì)發(fā)現(xiàn)獲得的結(jié)果真可以說(shuō)是“失之毫厘,謬以千里”,看似大好的局面就會(huì)像美麗的泡沫一樣,用針一戳,轉(zhuǎn)眼就消失得無(wú)影無(wú)蹤。故而,我們需要在性能與數(shù)據(jù)正確性間作出權(quán)衡。.Net ,特別是基于MSSQL Server的SqlCacheDependency特性,使得我們可以避免“數(shù)據(jù)過(guò)期”的問(wèn)題,它能夠根據(jù)數(shù)據(jù)庫(kù)中相應(yīng)數(shù)據(jù)的變化,通知緩存,并移除那些過(guò)期的數(shù)據(jù)。 SqlCacheDependency特性。當(dāng)數(shù)據(jù)表或表中
點(diǎn)擊復(fù)制文檔內(nèi)容
范文總結(jié)相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1