加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

序列发生器组件 Example 程序

发布时间:2020-12-12 15:10:20 所属栏目:MsSql教程 来源:网络整理
导读:第一次鼓起勇气发首页,大家有想法的,多留言,写得不好,欢迎批评交流。坚持实实在在如铜墙铁壁。 开发软件项目,其实跟盖房子原理很接近,需要很多组件来拼装,例如都需要砖头,序列生成器,其实也 是开发软件过程中的重要砖头之一,是软件项目的最基础的

第一次鼓起勇气发首页,大家有想法的,多留言,写得不好,欢迎批评交流。坚持实实在在如铜墙铁壁。

开发软件项目,其实跟盖房子原理很接近,需要很多组件来拼装,例如都需要砖头,序列生成器,其实也
是开发软件过程中的重要砖头之一,是软件项目的最基础的组件之一。

开发软件时经常需要要产生唯一的不重复的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数据库,有兴趣的朋友,可以下载看看。
http://files.cnblogs.com/jirigala/Example_Sequence.rar
http://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,10000025,10000000,1,'默认值');

?

若有疑问或者相关问题,可以加QQ: 2520 56973 咨询。

将权限管理、工作流管理做到我能力的极致,一个人只能做好那么很少的几件事情。

posted on 2008-10-21 15:49 不仅仅是通用权限设计 阅读(1341) 评论(4) 编辑 收藏

评论

#1楼   回复  引用  查看  ?? 蛙蛙推荐:写一个主键生成组件(服务)
http://www.cnblogs.com/onlytiancai/archive/2007/09/23/903338.html

2008-10-21 17:17 | 蛙蛙池塘? ?????

#2楼  回复 引用 ??

看看在说 2008-10-21 17:40 | 用盗版,我错了[未注册用户]

#3楼  回复 引用 查看 ??

最近用的都是guid,反正坚持一条原则:绝不显示出来!免得看了闹心。 2008-10-21 20:03 | 悟不透? ?????

#4楼  回复 引用 查看 ??

不就是SNGenerator嘛

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读