對比結果概述
本文中對兩種數據庫平台的對比結果顯示了在構建數據庫應用程序時使用SQL Server (代碼代號Yukon)結合Visual Studio進行開發比使用DB UDB (代碼代號Stinger)結合Visual Studio有著顯著的優勢在開發調試和部署數據庫解決方案的時候這些優勢就將轉化為在時間和資金上的節省在本文中特別說明了SQL Server 與DB UDB 相比對NET數據庫對象的支持要廣泛的多另外你會發現在構建和管理數據庫對象時SQL Server 和Visual Studio集成的程度要比DB UDB 和Visual Studio的集成緊密的多在本文中你還會看到SQL Server 所提供的開發平台除了關系型數據庫之外還有其他許多功能這一點超過了DB UDB
前言
在過去IT開發技術分成了程序開發語言產品環境配置和數據操作這三種相對獨立的專業技能為了綜合使用這些相對獨立的技能往往需要專門的技術和大量的人力現在有了SQL Server 和Visual Studio 我們擁有了一個統一的開發環境集成於其中的編程模型提供了整體的解決方案包容了客戶端數據庫應用程序服務器管理工具和服務器端數據庫對象的構建如此對工具和框架功能性的改善將使得開發者和客戶都能從中受益因為它將會對應用程序的可用性性能安全性和可伸縮性帶來一個全面的提升
SQL Server 和DB 中對Visual Studio環境和數據庫數據提供程序的集成將簡化和改善應用程序的開發流程它們提供了旨在提高生產率的構建和部署應用程序的工具這將會給程序開發和應用程序管理帶來更好的性能表現SQL Server 和DB UDB 中對NET框架的集成帶來了一個更加高效和更加靈活的數據庫應用程序開發環境由此得到了比先前版本執行效率更高的更加健壯的數據庫解決方案它擁有更好的易用性和可伸縮性通過利用集成的NET環境數據庫開發人員就可以實現以前使用SQL代碼不可能得到的結果通過使用NET框架開發人員寫出的代碼能具有更加復雜的邏輯更加適合於解決計算問題並能訪問到外部的系統和網絡資源因為NET語言例如Visual BasicC#和C++都是完全的面向對象編程語言具有像封裝繼承和多態性這樣的面向對象編程的特性它們還具有許多在SQL語言中不存在的功能例如數組結構化異常處理集合等
如今Microsoft NET提供了最先進最高效的構建和整合數據庫應用程序的環境在這篇文章中我們將比較SQL Server 和DB UDB 分別提供的NET集成的程度為了能充分說明這其中的差別我們將做一個詳細的技術演示來顯示分別使用SQL Server 和DB UDB 構建一個NET存儲過程的具體步驟
核心技術比較
雖然SQL Server 和DB UDB 都集成了NET框架和Visual Studio但各自的集成程度有著顯著的差別下面這張表格中列出了關於它們對NET的集成程度的比較
NET功能
SQL Server
DB UDB
NET數據提供程序
是(SQL Server NET
數據提供程序)
是(DB NET
數據提供程序)
NET存儲過程
是
是
NET用戶定義函數
是
是(需要手工創建)
NET觸發器
是
否
NET用戶定義類型
是
否
NET用戶定義聚集
是
否
Visual Studio工具
是
是
數據提供程序
SQL Server 和DB UDB 都自帶了NET數據提供程序使得NET客戶端程序能夠訪問數據庫平台這些天生的數據提供程序與基於OLE DB的數據提供程序相比會給服務器應用程序帶來更好的性能和可伸縮性這兩種數據提供程序有著非常相似的功能都能執行基本的ADONET對象包括ConnectionCommandDataReaderDataSet和DataAdapter但它們有一個關鍵的差別:SQL Server NET數據提供程序有兩種模式可用一個針對於客戶端應用程序另一個針對於服務器端應用程序這一點對於服務器端應用程序開發特別重要因為SQL Server服務器端NET數據提供程序是一個駐於內存的程序它不用像客戶端數據提供程序那樣去考慮網絡流量的限制因此服務器端NET數據提供程序能針對NET數據庫對象實現更好的性能另外服務器端數據提供程序還開放了一組只適合於服務器端代碼的功能例如服務器端游標針對客戶端應用程序的數據提供程序所開放的功能在SystemDataSqlClient命名空間中而服務器端數據提供程序所開放的功能在SystemDataSqlserver命名空間中在DB UDB 中只有單獨的IBMDataDB命名空間DB NET數據提供程序使用DBContext對象來創建駐於內存的數據庫連接
在服務器端它們同樣有相似之處DB和SQL Server都支持使用NET語言構建應用程序以及隨後在服務器端部署其實除了這一基本概念這兩種數據庫平台對NET的集成程度有著很大的差異DB UDB 支持創建NET存儲過程和NET用戶定義函數可是Visual Studio IDE只支持創建DB UDB NET存儲過程DB UDB NET函數必須手工創建與之相比SQL Server 對NET的支持要廣泛的多和DB一樣SQL Server支持創建NET存儲過程和NET用戶定義函數除此之外SQL Server還支持NET觸發器NET用戶定義類型(UDT)以及NET用戶定義聚集所有這些對象的創建都被完全集成到Visual Studio IDE中了能使用NET語言構建存儲過程和函數對數據庫開發人員來說肯定是個好消息這將使得他們能夠實現更加復雜的商業邏輯和函數功能而不必受限於標准SQL的功能這一點無疑是將NET與數據庫集成的關鍵所在當然使用NET語言創建觸發器用戶定義類型以及用戶定義聚集也很有用使用NET語言創建觸發器將使得觸發器的代碼能更加完全地封裝商業邏輯同時還能執行一些附加的操作例如訪問外部資源記錄操作日志使用NET語言創建用戶定義類型能使得數據庫開發人員能擴展系統中原有的數據類型這些用戶定義類型能擁有自己獨立的屬性和操作符這使得開發人員可以無縫地擴展原有的數據類型在使用的時候就和原有的數據類型一樣具有各自的操作符和聚集同樣地使用NET創建用戶定義聚集使開發人員能創建自定義的聚集操作應用於原有的數據類型或是用戶自定義的數據類型
除了這些基本的NET功能在NET框架與各自的數據庫服務器集成方面還有重大的差異在下一部分中我們將更深入地討論NET集成的細節
NET框架集成
Microsoft® NET是用來把信息人力系統和設備聯系在一起的一組Microsoft軟件技術NET框架是構建和運行下一代軟件應用程序和Web Service所必需的Windows組件
NET框架:
·支持超過二十種不同的編程語言
·管理著大量的管道——有助於提高軟件開發效率並使得開發人員的精力更加集中於核心商業邏輯代碼上
·使得構建部署和管理一個安全的健壯的以及性能卓越的應用程序比以前更加容易實現
NET框架由公共語言運行庫(CLR)和統一分層的類庫集合所組成NET CLR的職責主要包括集成語言的運行服務強制安全性和對內存進程以及線程的管理在語言集成方面CLR定義了通用類型系統(CTS)它描述了跨越所有NET語言的基本數據類型以及關於那些數據類型的操作NET框架提供了大量的類集供開發人員應用於他們的應用程序中這些類集涵蓋了很多方面的內容包括I/O網絡文本處理數據訪問加密XML處理Web Service等等這樣就允許開發人員能把精力主要集中在構建商業邏輯上而不是埋頭於管道代碼中因為這些能在NET框架的類集中找到SQL Server 和IBM DB UDB 中對NET CLR的集成使得可以用任何一種NET語言(包括C#Visual BasicC++以及J#)來開發數據庫對象
這兩種不同的數據庫平台和NET框架集成的方式是完全不同的SQL Server 數據庫引擎將CLR宿於進程內這意味著同時運行數據庫引擎和NET運行庫只需要一個獨立的操作系統進程與之相比DB UDB 和NET框架的集成采用的是進程外的模型圖對不同的數據庫CLR實現方式進行了直觀描述
集成模型的含意
SQL Server 集成NET運行庫時采用的進程內模型與進程外模型相比有一些非常明顯的優勢首先將CLR集成在進程內部使得SQL Server能以不同的方式控制CLR的運行內存管理垃圾收集器線程支持的核心功能將受到SQL Server主機的控制而不是采用NET的默認設置和操作這一點非常重要因為SQL Server數據庫引擎能更好地從整體的角度來考察系統需求從而使得它能根據實際情況優化內存和線程的管理最終以進程內模型集成CLR的SQL Server 能創建得到更加健壯和有更好伸縮性的解決方案
舉個例子考慮一個負擔沉重的數據庫實例要響應許多並發的請求這一情況已經持續了很長一段時間SQL Server能自動和智能地在數據存儲和程序邏輯(例如NET存儲過程)之間平衡內存的分配當系統的負擔有了一些性質上的變化——例如相對較多的請求利用了較多的程序邏輯——SQL Server會再次自動地進行調整這樣系統的性能會根據滿足實際需求的伸縮性和可靠性進行不斷的優化因為DB UDB v采用進程外的模型集成NET運行庫所以DB不能提供這種類型的機器資源動態平衡和性能優化
SQL Server 是通過使用CLR 主機API來實現動態優化的這些API只在NET框架版中存在而在NET框架以前的版本裡是沒有的必然的結果SQL Server 需要集成NET框架版而DB集成的是NET框架版集成的程度自然較低
NET 與NET 的差別
使用NET框架版結合SQL Server 和Visual Studio 與使用NET框架版結合DB UDB 相比有著一些顯著的優勢NET框架版和以前版本相比功能有著顯著的增強:
·改善的性能和裝載時間
·支持泛型(同一個類和方法可針對於不同數據類型的值一樣運行因此提高了代碼重用性)
·支持編輯後繼續運行(EditandContinue)開發人員能夠在執行過程中修改代碼而無需中止和重新開始調試會話
·一個新的數據保護API(DPAPI)使得應用程序能對某些敏感信息加密例如連接字符串甚至內存塊
·流的身份驗證功能通過新的NegotiateStream和SslStream類允許您使用 Kerberos 或 SSL 來實現客戶端和服務器端的安全通道
·COM互操作性的改善將使得NET應用程序在調用現存的COM對象時有著更好的性能和可靠性
·經過改善的I/O性能加上對GZIP數據壓縮的支持
·位應用程序兼容性
部署NET邏輯到SQL Server
每個數據庫平台實際使用NET對象的方式也是有著很大差別的在SQL Server 中一個新的SQL Server數據庫對象程序集(Assembly)是部署NET對象(例如觸發器或是存儲過程)的最小單元程序集組是部署NET邏輯的最小單元為了創建CLR數據庫對象你必須首先使用Visual Studio 創建一個DLL接著將這個DLL導入到SQL Server中作為一個數據庫程序集對象這些步驟能夠使用命令行編譯器和CREATE ASSEMBLY命令手工實現或者像在技術演示部分裡所看到的一樣Visual Studio 能自動完成整個流程
SQL Server中Assembly的安全
SQL Server 給數據庫管理員提供了一個新的安全單元——程序集程序集可被標記為三種安全狀態:SAFEEXTERNAL和UNSAFE這些安全標號供數據庫管理員用來管理和保護所有在數據庫裡以程序集級別運行的NET代碼SAFE標號表示這個程序集只使用托管代碼並且不訪問數據庫之外的資源EXTERNAL標號表示這個程序集使用托管代碼訪問外部資源例如文件系統或是網絡等非數據庫之內的資源UNSAFE標號表示這個程序集能夠包含托管和(或)非托管代碼並且能夠訪問任何內部或外部的資源由UNSAFE程序集創建的數據庫對象只能被擁有系統管理員權利的用戶執行
部署NET邏輯到DB
雖然將NET托管代碼裝入DB UDB 的流程與裝入SQL Server 的流程很相似但在數據庫對象類型和存儲位置以及安全和數據庫管理流程方面還是有著一些差別為了創建DB中的CLR數據庫對象你得首先使用Visual Studio並采用某種NET托管語言創建一個DLL這個DLL文件需要拷貝到DB安裝路徑專門的目錄中去或者在創建存儲過程或者函數的時候提供這個DLL文件的完全路徑這個DLL實際上不是一個數據庫對象也沒有被導入到數據庫表中相反它只是一個操作系統中的文件接著這個DLL將出現在創建數據庫對象(例如存儲過程或者函數)的CREATE命令中在技術演示部分中你將會看到使用Visual Studio 能夠自動完成創建DB CLR存儲過程的整個流程不過創建用戶定義函數則不一樣你只用通過手工來完成創建用戶定義函數的流程
一個數據庫管理員或者是一個應用程序開發人員通常需要保護與DB外部程序相關的DLL程序集這可以通過限制程序運行時的操作來實現這步工作在創建過程或函數時在CREATE語句的EXECUTION CONTROL子句中完成有效的執行控制模式包括:SAFEFILEREADFILEWRITENETWORK和UNSAFE如果沒有指定執行控制模式默認模式是SAFE這將意味著這個CLR程序只能訪問由數據庫管理員控制的資源這樣的資源包括所有的表和由數據庫實例管理的架構FILEREADFILEWRITE和NETWORK執行模式允許托管代碼訪問本地文件系統或者是網絡上的資源UNSAFE執行模式將不會在資源訪問上做任何限制標記為UNSAFE執行模式的程序可以執行二進制代碼既然DB與NET的集成采用的是進程外的模型那麼在使用CREATE語句創建DB CLR過程和函數時必須采用FENCED子句用以說明NET邏輯和數據庫管理器在不同的進程中運行並且不使用共享內存通訊這就造成了在程序邏輯與數據庫本身之間傳輸數據的時候與進程內模型相比有一個性能上的障礙
From:http://tw.wingwit.com/Article/program/SQLServer/201311/22064.html