序列发生器组件 Example 程序
2008-10-21 15:49 通用C#系统架构 阅读(2058) 评论(4) 编辑 收藏 举报第一次鼓起勇气发首页,大家有想法的,多留言,写得不好,欢迎批评交流。坚持实实在在如铜墙铁壁。
开发软件项目,其实跟盖房子原理很接近,需要很多组件来拼装,例如都需要砖头,序列生成器,其实也
是开发软件过程中的重要砖头之一,是软件项目的最基础的组件之一。
开发软件时经常需要要产生唯一的不重复的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数据库,有兴趣的朋友,可以下载看看。
https://files.cnblogs.com/jirigala/Example_Sequence.rar
https://files.cnblogs.com/jirigala/DotNet.Common.Example.rar
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, '默认值');
若有疑问或者相关问题,可以加QQ: 2520 56973 咨询。