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