直播中
SQL Server XML 模板經(jīng)過高度流程化,能盡可能高效地通過 HTTP 訪問數(shù)據(jù)庫。為此付出的代價是功能集受到限制。在模板中找不到所需功能的情況下,SQL Server 的專用 ISAPI 應(yīng)用被替換為 ASP、ASP 和 COM+ 的組合或自定義的 ISAPI 應(yīng)用。
本節(jié)中說明的體系結(jié)構(gòu)適用于您的頁面要執(zhí)行下列操作的情況:
訪問多個服務(wù)器上的數(shù)據(jù)庫
處理在設(shè)計時未知其格式的 HTTP 請求
調(diào)用 COM/COM+ 對象
使用 COM+ 事務(wù)
連接至 Internet 上的任何應(yīng)用或 Web 服務(wù),例如付款提供程序
圖 4:寫入方體系結(jié)構(gòu)
Web 層上的代碼表示應(yīng)用功能的四個層——數(shù)據(jù)訪問、業(yè)務(wù)邏輯、工作流和表示。在開發(fā)應(yīng)用時,請確保此代碼與體系結(jié)構(gòu)保持一致。這可使代碼的可讀性更高,也更易于維護。如果決定單獨使用 ASP,腳本類的效率會更高。如果在業(yè)務(wù)邏輯層或工作流層有大量復(fù)雜的處理,對這些層使用 COM+ 組件可能速度更快。相反,對于處理量相對較小的情況,使用腳本可能速度更快。
這種新體系結(jié)構(gòu)更出色的原因是,所有層(從數(shù)據(jù)到表示)都使用 XML 來傳輸和存儲信息。數(shù)據(jù)庫中的存儲過程使用這些新功能來讀寫 XML。數(shù)據(jù)訪問層利用 ADO 2.6 流與數(shù)據(jù)庫進行高效、基于 XML 的通訊。
更新穎的方法是將某些中間層下移到數(shù)據(jù)庫中。
以數(shù)據(jù)庫為中心的體系結(jié)構(gòu)
Duwamish Online 體系結(jié)構(gòu)基于這樣一種設(shè)想:因為數(shù)據(jù)庫的可伸縮性最低,它應(yīng)該設(shè)計成執(zhí)行盡可能少的任務(wù)。分布式分區(qū)視圖等新功能允許在多個服務(wù)器之間分擔(dān)工作量,從而提高了數(shù)據(jù)庫的可伸縮性,使開發(fā)人員可以選擇將大部分工作放在何處。
如果選擇將“腳重”服務(wù)器群集(數(shù)據(jù)庫方面功能更強)與 SQL Server XML 體系結(jié)構(gòu)一起使用,則另一種方法是使用與 n-層組件的分層方式相似的方式來對數(shù)據(jù)庫中的存儲過程進行分層。要實現(xiàn)這一點,必須有好的編程方法,例如選擇適當(dāng)?shù)臄?shù)據(jù)結(jié)構(gòu)和盡可能避免重復(fù)代碼。
圖 5:以數(shù)據(jù)庫為中心的體系結(jié)構(gòu)
這種體系結(jié)構(gòu)中的表示層還包含用于訪問數(shù)據(jù)庫中的存儲過程的代碼。此代碼可能與傳統(tǒng)數(shù)據(jù)訪問層中的代碼相同。但是,調(diào)用此代碼時數(shù)據(jù)訪問層可能會出錯,因為這些例程調(diào)用工作流層提供的接口。
在使用存儲過程進行開發(fā)工作時應(yīng)該小心避免出現(xiàn)缺陷。讓我們先來看一個設(shè)計,這個設(shè)計使用了幾個智能存儲過程,它們先執(zhí)行該層的公共任務(wù),然后再執(zhí)行在下一個層上繼續(xù)執(zhí)行其代碼路徑的邏輯切換。在工作流層中調(diào)用“智能過程”將對應(yīng)于若干個不同的操作之一。此過程如下所示:
CREATE PROCEDURE
/* 這是一個智能過程,執(zhí)行工作流操作 */
DoWorkflow
/* Action 用于選擇該調(diào)用的多個操作之一 */
@Action nvarchar(255),
/* SomeOtherParameters 是一個占位符,用于工作流所需的其他輸入 */
@SomeOtherParameters ntext
AS
/* 執(zhí)行工作流的公共操作 */
Execute SomeCommonWorkflowOperations
If @Action = N'Action1'
BEGIN
/* 執(zhí)行 Action 1 */
Execute BusinessLogicAction1
END
Else If @Action = N'Action2'
BEGIN
/* 執(zhí)行 Action 2 */
Execute BusinessLogicAction2
END
GO
第一次調(diào)用此過程時,SQL Server 優(yōu)化執(zhí)行恰好第一次運行的任何代碼路徑。這使其余代碼路徑的運行效率降低,盡管它們的成本可能更高或者使用的頻率更高。
為確保優(yōu)化執(zhí)行所有代碼路徑,可為每個操作創(chuàng)建一個單獨的過程,盡可能避免切換邏輯。為防止代碼重復(fù),所有層中多個操作共享的函數(shù)應(yīng)該放在單獨的過程中。當(dāng)該設(shè)計產(chǎn)生大量過程時,優(yōu)化可以大大提高應(yīng)用的效率。
集成
Web 開發(fā)中最值得稱道的一點是用戶看不到實施過程。因此,本文中介紹的體系結(jié)構(gòu)可以輕松地合并到單個應(yīng)用中,而無需用戶參與。下面是一些準(zhǔn)則,可以幫助您更輕松地集成應(yīng)用的不同部分:
在整個應(yīng)用中使用 XML。XML 可以用于任何技術(shù)中,可以使用 XSL 樣式表輕松地進行轉(zhuǎn)換,還可以毫無困難地存儲在任何地方。SQL Server XML 使得在您的應(yīng)用中使用 XML 比以前更容易。
盡可能分解代碼。
使用 XSL 樣式表來轉(zhuǎn)換 XML??梢栽谀0?、COM+ 組件和一段腳本之間方便地共享同一個 XSL 樣式表。
當(dāng)腳本執(zhí)行多個函數(shù)時,使用腳本類分解代碼。
在數(shù)據(jù)庫方面,始終使用存儲過程進行數(shù)據(jù)訪問。它們不僅易于維護,而且比未編譯的 SQL 查詢執(zhí)行速度快得多。
影響
本節(jié)說明使用新的體系結(jié)構(gòu)對于您的應(yīng)用在“功能”和性能方面有何影響。
可編程性
可編程性是指容易編寫應(yīng)用代碼。通常反映在開發(fā)應(yīng)用的時間而不是功能方面。以 Duwamish Online 應(yīng)用為例。該應(yīng)用的五個層是通過一組完全不同的技術(shù)來實現(xiàn)的。表示層使用了 C++(用于緩存組件)和 Web 技術(shù)(例如 XML、XSL 和 ASP)。工作流層、業(yè)務(wù)邏輯層和數(shù)據(jù)訪問層是 Visual Basic COM+ 組件,而數(shù)據(jù)庫中的存儲過程是用 T-SQL 編寫的。使用這么多技術(shù)的優(yōu)點是,開發(fā)人員可以針對每種類型的操作選擇最佳技術(shù)。但是,要使所有組件高效地緊密協(xié)作無疑是一個難點。當(dāng)使用多種不同的工具和不同的編程語言開發(fā)組件時,跨組件跟蹤和調(diào)試始終非常困難。
在整個應(yīng)用中使用 SQL Server XML 將有助于最大程度地降低不同技術(shù)的工作量。(XSL 是一個例外:它不屬于 SQL Server XML,但卻緊密集成在 SQL Server XML 模板中)。各層之間一起工作,但產(chǎn)生的沖突最少。在各層之間進行調(diào)試非常簡便,因為所有的中間數(shù)據(jù)都是 XML,無需任何額外操作。但是,可編程性的最大優(yōu)點可能是大大減少了代碼量:基于 SQL Server XML 版本的 Duwamish Books, Phase 4 可完成基于 COM+ 的同類產(chǎn)品相同的工作,但前者的代碼量只有后者的十分之一。通過 SQL Server XML 的內(nèi)置功能使數(shù)據(jù)訪問、XML 轉(zhuǎn)換、XSL 轉(zhuǎn)換和數(shù)據(jù)緩存變得更加簡便。
遺憾的是,不能再使用 XSL 的高效調(diào)試工具,而用于其他新技術(shù)的調(diào)試工具相對來講還不成熟(尤其是與 Microsoft Visual Studio® 提供的跨語言調(diào)試能力相比)。
可管理性
SQL Server XML 應(yīng)用易于部署。對于運行在 Web 層的代碼,只需簡單地將文件復(fù)制到它們的目標(biāo)目錄,然后運行一次配置工具以建立相應(yīng)的虛擬目錄。更新過程只是簡單地替換過期的文件??梢允褂?SQL Server Enterprise Manager 輕松地管理數(shù)據(jù)庫對象。
性能
有關(guān)詳細信息,請參閱 Duwamish Online SQL Server XML 分類瀏覽文章中有關(guān)性能的一節(jié)。
使用建議
有關(guān)新技術(shù)最重要的問題可能是使用的時機。盡管 SQL Server XML 不是所有 Internet 問題的最終解決方案,但是在某些情況下,其優(yōu)勢是顯而易見的,這包括代碼量大大減少、開發(fā)周期明顯縮短、性能更高和維護更方便。新技術(shù)的兩個主要組件(數(shù)據(jù)庫和 ISAPI 應(yīng)用)的使用情況不同,如下所述。
SQL Server XML 的數(shù)據(jù)庫服務(wù)器組件幾乎用于所有應(yīng)用。即使要將現(xiàn)有的應(yīng)用從使用數(shù)據(jù)庫轉(zhuǎn)換為使用 XML 也是值得的。一些顯著的優(yōu)點如下:
易于本地化(使用 XSL)
不依賴于平臺和技術(shù)
易于緩存 XML 數(shù)據(jù)
能夠使用脫機/斷開連接的應(yīng)用
易于合并或創(chuàng)建 Web 服務(wù)
能夠與其他應(yīng)用協(xié)同工作
新技術(shù)的 Web 界面組件是專用的。它們可提供對數(shù)據(jù)庫的快速、高效訪問,并提供使用 XSL 樣式表輕松創(chuàng)建數(shù)據(jù)驅(qū)動頁的能力。這些優(yōu)點非常有用。在我們的測試中,Duwamish Online SQL Server XML 分類瀏覽(無緩存)比 Duwamish Online(有緩存)的性能高 15%。使用 SQL Server 2000 技術(shù)預(yù)覽版進行的早期測試顯示 SQL Server XML ISAPI 緩存可使性能有數(shù)量級的提高。但是,如果應(yīng)用包含下列任何一種情況,則可以考慮使用基于 ASP 的中間層:
與數(shù)據(jù)提取無關(guān)的擴展業(yè)務(wù)邏輯例程。有兩個選項決定這些例程的位置:數(shù)據(jù)庫的存儲過程或 XSL 中的腳本。腳本的效率不夠高,而結(jié)構(gòu)化查詢語言 (SQL) 可能不是最佳語言。
擴展字符串,尤其是結(jié)果集合的處理。此規(guī)則的例外情況是存儲在 XML 或 HTML 數(shù)據(jù)庫中的轉(zhuǎn)義字符串。SQL Server 2000 的一個新功能將自動完成這項工作。有關(guān)詳細信息,請參閱 SQL Server Books Online 文檔(XML 和 Internet 支持 \ 檢索和編寫 XML 數(shù)據(jù) \ 使用 FOR XML 檢索 XML 文檔 \ 使用 EXPLICIT 模式\ F. 指定 cdata 指令)。
大量 HTML 輸入。模板的局限性使其無法通過在設(shè)計時已知其格式的 HTTP 請求檢索所有信息,此工作可以使用 ASP 頁完成。
注意!SQL Server 2000 還允許通過 URL 直接訪問數(shù)據(jù)庫。在其他情況下,允許使用動態(tài)模板來幫助解決體系結(jié)構(gòu)方面的很多問題。但是,如果啟用此功能,將允許嘗試刪除數(shù)據(jù)庫的查詢,因此,如果選擇使用此功能,請確保數(shù)據(jù)庫的安全性無懈可擊。
總結(jié)
SQL Server XML 提供了一種新的觀念,通過允許從數(shù)據(jù)庫直接檢索 XML,使您的應(yīng)用可以端對端使用 XML。新的 ISAPI 應(yīng)用提供了令人滿意的性能,但不一定適用于應(yīng)用中的所有使用情況。