全面解析CLR是什么一點(diǎn)通
CLR是什么,有些人對(duì)這個(gè)概念不是很深入的理解,要在代碼中熟練的運(yùn)用CLR,我們就要深入的了解CLR底層的架構(gòu),為了更好的理解應(yīng)用程序在IIS中的運(yùn)行機(jī)制,在網(wǎng)上搜集了一些關(guān)于CLR是什么的基礎(chǔ)知識(shí),希望對(duì)大家有幫助。
CLR(公用語(yǔ)言運(yùn)行時(shí))和Java虛擬機(jī)一樣也是一個(gè)運(yùn)行時(shí)環(huán)境,它負(fù)責(zé)資源管理(內(nèi)存分配和垃圾收集),并保證應(yīng)用和底層操作系統(tǒng)之間必要的分離。.NET提供了一個(gè)運(yùn)行時(shí)環(huán)境,叫做公用語(yǔ)言運(yùn)行時(shí)(Commen Language Runtime),是一種多語(yǔ)言執(zhí)行環(huán)境,支持眾多的數(shù)據(jù)類(lèi)型和語(yǔ)言特性。他管理著代碼的執(zhí)行,并使開(kāi)發(fā)過(guò)程變得更加簡(jiǎn)單。這是一種可操控的執(zhí)行環(huán)境,其功能通過(guò)編譯器與其他工具共同展現(xiàn)。依靠一種以運(yùn)行時(shí)為目標(biāo)的編譯器開(kāi)發(fā)的代碼叫做可操控代碼managed code。與之相對(duì)的是unmanaged code。
元數(shù)據(jù)metadata:為了使運(yùn)行時(shí)環(huán)境可以向可操控代碼提供服務(wù),語(yǔ)言編譯器需要產(chǎn)生一種元數(shù)據(jù),它將提供在使用語(yǔ)言中的類(lèi)型、成員、引用的信息。運(yùn)行時(shí)環(huán)境使用元數(shù)據(jù)定位并載入類(lèi),在內(nèi)存中展開(kāi)對(duì)象實(shí)例,解決方法調(diào)用,產(chǎn)生本地代碼,強(qiáng)制執(zhí)行安全性,并建立運(yùn)行時(shí)環(huán)境的邊界。
可操控執(zhí)行的含義:對(duì)象在執(zhí)行的過(guò)程中完全被運(yùn)行時(shí)環(huán)境所控制。運(yùn)行時(shí)環(huán)境提供以下服務(wù):自動(dòng)內(nèi)存管理、調(diào)試支持、增強(qiáng)的安全性及與非可操控性代碼的互操作性。條件:
1、選擇以運(yùn)行時(shí)為目標(biāo)的語(yǔ)言編譯器,如VB、C#;
2、在組件的輸出類(lèi)型中使用CLR要求的語(yǔ)言特性。
CLR用什么提高了平臺(tái)的可靠性?以及為了達(dá)到面向事務(wù)的電子商務(wù)應(yīng)用所要求的穩(wěn)定性級(jí)別,CLR還要負(fù)責(zé)其他一些任務(wù),比如監(jiān)視程序的運(yùn)行。按照.NET的說(shuō)法,在CLR監(jiān)視之下運(yùn)行的程序?qū)儆凇笆芄芾淼摹保╩anaged)代碼,而不在CLR之下、直接在裸機(jī)上運(yùn)行的應(yīng)用或者組件屬于“非受管理的”(unmanaged)的代碼。CLR將監(jiān)視形形色色的常見(jiàn)編程錯(cuò)誤,許多年來(lái)這些錯(cuò)誤一直是軟件故障的主要根源,其中包括:訪問(wèn)數(shù)組元素越界,訪問(wèn)未分配的內(nèi)存空間,由于數(shù)據(jù)體積過(guò)大而導(dǎo)致的內(nèi)存溢出,等等。
然而,這種對(duì)受管理代碼的運(yùn)行監(jiān)視是有代價(jià)的。雖然當(dāng)前還不可能精確地得到監(jiān)視程序運(yùn)行所需要的開(kāi)銷(xiāo),但從當(dāng)前Beta測(cè)試版的性能表現(xiàn)來(lái)看,正如Microsoft所承認(rèn)的那樣,我們可以預(yù)料由它導(dǎo)致的性能降低程度至少達(dá)到10%。當(dāng)然,如果監(jiān)視程序運(yùn)行能夠?qū)⒎€(wěn)定性和可用性提高到一個(gè)新的檔次,我們可以懷疑10%的性能降低是否還可以稱為一件壞事……
為什么微軟要集成clr 到sql server?
在我看來(lái),CLR是什么?clr是 存儲(chǔ)過(guò)程非常好的東西,它彌補(bǔ)了t-sql 做為一門(mén)查詢語(yǔ)言的不足,使得數(shù)據(jù)庫(kù)在處理邏輯問(wèn)題的時(shí)候不像以前那么蹩腳,許多DB程序員為了用 t-sql實(shí)現(xiàn)一個(gè)簡(jiǎn)單的過(guò)程邏輯而大傷腦筋,比如一個(gè)非常間的需求,我想傳遞一個(gè)數(shù)組,里面裝有id,想更新這些id的行的狀態(tài),就是在傳遞一個(gè)數(shù)組到存儲(chǔ)過(guò)程中并分割成若干個(gè)id,一個(gè)在C#中非常簡(jiǎn)單的實(shí)現(xiàn)卻要為t-sql絞盡腦汁。。。。相信大多數(shù)程序員都有我類(lèi)似的苦惱。而在最近的項(xiàng)目中,涉及到由聯(lián)通過(guò)來(lái)的短信數(shù)據(jù)處理,預(yù)處理短信表是由另外一個(gè)模塊插入的,我負(fù)責(zé)的模塊需要對(duì)這個(gè)預(yù)處理短信表的記錄讀取出來(lái),定時(shí)掃描整個(gè)表,如果有需要處理的短信,那么要由windows服務(wù)定時(shí)讀取出來(lái),并且根據(jù)短信種類(lèi)的不同做業(yè)務(wù)邏輯的分發(fā),整個(gè)模塊的性能要求非常高,所有的上行短信都要經(jīng)過(guò)這個(gè)表,并處理。每秒發(fā)生的開(kāi)連接插入刪除造作非常多。最開(kāi)始的設(shè)計(jì)是使用windows服務(wù)定時(shí)掃表并更新回?cái)?shù)據(jù)庫(kù),一條一條的更新回?cái)?shù)據(jù)庫(kù)。。。。其性能之差是難以想象的。所以準(zhǔn)備采取clr存儲(chǔ)過(guò)程結(jié)合job,把業(yè)務(wù)邏輯的分發(fā)也拿到數(shù)據(jù)庫(kù)clr環(huán)境下做,節(jié)省往返開(kāi)銷(xiāo)和連接開(kāi)銷(xiāo)。
總之,t-sql 是一門(mén)面向查詢的語(yǔ)言,以數(shù)據(jù)為主,但是對(duì)過(guò)程的處理支持卻非常差勁,clr 集成就能非常好的彌補(bǔ)了這點(diǎn)。之所以寫(xiě)個(gè)開(kāi)篇,是看到有些人還是對(duì)這種技術(shù)的應(yīng)用環(huán)境的不了解。好了,接下來(lái),我準(zhǔn)備寫(xiě)一些關(guān)于clr 集成的 sql server 2005 下的應(yīng)用,包括clr proc clr function 等。歡迎大家指正!
附上使用context connection 和使用一般數(shù)據(jù)庫(kù)連接的對(duì)比圖,大家可以參考一下。
【編輯推薦】