天天看點

序列發生器元件 Example 程式

第一次鼓起勇氣發首頁,大家有想法的,多留言,寫得不好,歡迎批評交流。堅持實實在在如銅牆鐵壁。

開發軟體項目,其實跟蓋房子原理很接近,需要很多元件來拼裝,例如都需要磚頭,序列生成器,其實也

是開發軟體過程中的重要磚頭之一,是軟體項目的最基礎的元件之一。

開發軟體時經常需要要産生唯一的不重複的ID代碼,還有有序增加的序列号、編号等,在單機使用時,問題

不嚴重,不容易暴露出來元件的錯誤,但是在多使用者并發時運作時或分布式運作環境下,元件的有很多缺陷

都會暴露出來的。

采用Guid方式生成主鍵是很不錯注意,但是有一個缺點,主鍵太長了,誰都不希望用這麼老長的字元串做為

主鍵,總覺得會影響軟體系統運作速度,大多數人也可能說,喜歡用自增量,SqlServer裡自增量是比較好用,

但是Oracle裡沒有這個屬性,用序列來實作,我們辛苦寫出來的一大堆程式,隻能在sqlserver上跑,那就不太

完美了,不太可能寫兩套程式,一套是sqlserver的,一套是Oracle的,若發現了Bug是不是2個系統都要修改?

若需要改進了,兩個版本是不是都要進行改進?要測試呢?一般情況下,維護1套系統的2個版本是很不實際的

很少有人有能力能做到。就像一個人同時談兩個女朋友一樣,很難搞定。

我們寫得系統稍微複雜一些,都會是遇到主從表結構的設計,單表的設計還比較簡單,主鍵怎麼産生都容易一些,

問題複雜到主從表了,一定要有嚴謹的主外鍵産生政策,否則很容易亂套、程式運作不穩定,或出現并發問題。

經過很多項目的積累,我總結了以下幾個方法:(主要是産生主鍵及序列号用,相容多種資料庫)

1.獲得一個GUID

2.獲得一個Sequence,序列号,做為表的主鍵,外鍵等。

3.獲得一個Degression,降序的序列号,主要是排序時用。

4.批量獲得BatchSequence,一次性獲得多個主鍵,主要是為批量操作提高性能用。

5.獲得指定長度,指定啟始的 Sequence,主要是為了生成有序列規則的單号。

6.删除一個主鍵Delete,沒必要用的主鍵生成器,可以删除掉,系統裡垃圾太多了會不太爽。

理想狀态是,程式稍微修改一下配置,告訴系統,我現在用的是哪個資料庫就可以了,程式都能

平滑運作,這樣遇到遇到不通的資料庫,都沒多大關系,程式都是可以用的,大家也不用太擔心了。

有以上幾個方法,就可以很容易搞定,資料的排序問題、主鍵問題、序列号産生問題了。

抓幾個測試程式螢幕給大家看看。

運作後的效果

排序資料時用的頁面例子參考

序列産生時,還有一個注意的問題,就是若是采用了事務,最好是是在同一個事務裡。

區域及多個主機産生的序列号問題解決方法如事宜圖,Prefix字首方式,可以設定序列的字首,

友善資料合并及分布式運作環境。說實話其實很像Oracle裡的序列産生器。

附件為源代碼及MySql資料庫,有興趣的朋友,可以下載下傳看看。

<a href="http://files.cnblogs.com/jirigala/Example_Sequence.rar">http://files.cnblogs.com/jirigala/Example_Sequence.rar</a>

<a href="http://files.cnblogs.com/jirigala/DotNet.Common.Example.rar">http://files.cnblogs.com/jirigala/DotNet.Common.Example.rar</a>

CREATE TABLE `base_sequence` (

  `ID` VARCHAR(40)  NOT NULL DEFAULT '',

  `FullName` VARCHAR(40) NOT NULL DEFAULT '',

  `Prefix` VARCHAR(20) DEFAULT NULL,

  `Separate` VARCHAR(20) DEFAULT NULL,

  `Sequence` INTEGER(11) NOT NULL,

  `Degression` INTEGER(11) NOT NULL,

  `Step` INTEGER(11) NOT NULL,

  `Description` VARCHAR(200) DEFAULT NULL,

  PRIMARY KEY (`ID`)

)

COMMIT;

INSERT INTO `base_sequence` (`ID`, `FullName`, `Prefix`, `Separate`, `Sequence`, `Degression`, `Step`, `Description`) VALUES 

  ('10000000', 'Base_Sequence', NULL, NULL, 10000025, 10000000, 1, '預設值');

本文轉自 jirigala 51CTO部落格,原文連結:http://blog.51cto.com/2347979/451729,如需轉載請自行聯系原作者