增加ADO.NET優(yōu)化使用沖突
雖然有許多人對(duì)ADO.NET優(yōu)化表示懷疑,但在年復(fù)一年的不斷發(fā)展中,他的安全性也在不斷提高。保障ADO.NET優(yōu)化的安全性是完全有可能的,但前提是要深入理解到底什么是ADO.NET優(yōu)化,及他是怎么運(yùn)作的
避免自動(dòng)增加(Auto-Increment)值沖突
和許多數(shù)據(jù)源一樣,DataSet允許你在添加新行時(shí)識(shí)別自動(dòng)增加值的列。ADO.NET優(yōu)化在DataSet中使用自動(dòng)增加列時(shí),由于數(shù)據(jù)源也有自動(dòng)增加列,需要避免添加到DataSet中的本地行號(hào)與添加到數(shù)據(jù)源中的行之間的沖突。
例如,假設(shè)一個(gè)表的自動(dòng)增加主鍵列是CustomerID。兩個(gè)新客戶信息添加到該表,獲得的自動(dòng)增加CustomerID值分別是1和2。ADO.NET優(yōu)化接著只有第二個(gè)客戶行給數(shù)據(jù)適配器傳遞的Update方法,在數(shù)據(jù)源中新添加的行接受的自動(dòng)增加CustomerID值是1,與數(shù)據(jù)集中的2不匹配。當(dāng)數(shù)據(jù)適配器用返回值填充表中的第二行時(shí),ADO.NET優(yōu)化由于第一個(gè)顧客行的CustomerID是1,便出現(xiàn)了錯(cuò)誤。
為了避免這種情況,我們推薦當(dāng)使用數(shù)據(jù)源和數(shù)據(jù)集中有自動(dòng)增加列時(shí),數(shù)據(jù)集中的該列的AutoIncrementStep設(shè)為-1,AutoIncrementSeed設(shè)為0,同時(shí)確保數(shù)據(jù)源中生成的自動(dòng)增加標(biāo)識(shí)值從1開始,步長為正。結(jié)果是數(shù)據(jù)集生成負(fù)的自動(dòng)增加值,不會(huì)與數(shù)據(jù)源產(chǎn)生的正自動(dòng)增加值沖突。ADO.NET優(yōu)化另一種選擇是使用Guid類型的列帶有自動(dòng)增加列,該算法產(chǎn)生的Guid值在數(shù)據(jù)集和數(shù)據(jù)源中永遠(yuǎn)不同。
如果你的自動(dòng)增加列永遠(yuǎn)簡(jiǎn)單的作為唯一值,ADO.NET優(yōu)化沒有其它的意義,考慮使用Guid代替自動(dòng)增加列。它們是唯一的,避免了做另外的工作處理自動(dòng)增加列。
查找優(yōu)化的并發(fā)性故障
因?yàn)镈ataSet被設(shè)計(jì)為從數(shù)據(jù)源斷開,所有必須確保當(dāng)多個(gè)客戶端更新數(shù)據(jù)源的數(shù)據(jù)時(shí)應(yīng)用程序避免沖突。 測(cè)試優(yōu)化并發(fā)性錯(cuò)誤有多種技術(shù)。一種是在表的列中包含時(shí)間戳。另一種技術(shù)是通過使用SQL語句中的WHERE條件檢測(cè)來驗(yàn)證行中所有的源列值與數(shù)據(jù)庫中的匹配。#t#
多線程編程
ADO.NET優(yōu)化是為了提高性能、吞吐量和可伸縮性。結(jié)果是ADO.NET不鎖定資源并且只能在單個(gè)線程中使用,其中一個(gè)例外是DataSet,它對(duì)多個(gè)閱讀程序來說是線程安全安的。但是在寫的時(shí)候必須鎖定DataSet。 只在必要的時(shí)候使用COM交互操作(Interop)訪問ADO
ADO.NET被設(shè)計(jì)成大量應(yīng)用程序的最佳解決方案。但是,有些應(yīng)用程序需要只能使用ADO對(duì)象。在這些情況下,應(yīng)用程序能使用COM交互操作訪問ADO。注意使用COM交互操作訪問ADO的數(shù)據(jù)將極大的降低性能。設(shè)計(jì)應(yīng)用程序時(shí),在實(shí)現(xiàn)使用COM交互操作訪問ADO這種設(shè)計(jì)前首選決定ADO.NET是否符合設(shè)計(jì)需要。