最近一直在用.net做项目,数据库用的是oracle。由于一直用惯了hibernate的主键生成32位唯一值策略,在.net上却没有这些开源的生成机制,所以很多人都是用oracle的sequence自动生成序号做主键。
但是使用oracle的sequence自动生成序号做主键也会有一个问题,那就是当做一个分布式系统时,多个点的子系统都会向父系统同步数据,这时就需要为每个点的子系统的主键sequence设定一个区间范围,如A点的sequence范围1~10000,B点的sequence范围10000~20000等等,已保证A点和B点的数据向父系统汇总时,不会出现主键重复。或者是把每个子系统的主键设置为“子系统标识+sequence”的方式,如“A_”+sequence,“B_”+sequence等。
那有没有什么办法可以在oracle中像hibernate那样生成一个32位的唯一值呢?答案是有的,我们可以利用oracle的sys_guid() 函数生成一个32位的唯一值。
sql如下:
结果参见附件所示(不知道如何贴图啊)。
得到这个结果后,如何使用,大家就应该明白了。
但是使用oracle的sequence自动生成序号做主键也会有一个问题,那就是当做一个分布式系统时,多个点的子系统都会向父系统同步数据,这时就需要为每个点的子系统的主键sequence设定一个区间范围,如A点的sequence范围1~10000,B点的sequence范围10000~20000等等,已保证A点和B点的数据向父系统汇总时,不会出现主键重复。或者是把每个子系统的主键设置为“子系统标识+sequence”的方式,如“A_”+sequence,“B_”+sequence等。
那有没有什么办法可以在oracle中像hibernate那样生成一个32位的唯一值呢?答案是有的,我们可以利用oracle的sys_guid() 函数生成一个32位的唯一值。
sql如下:
select sys_guid() from dual ;结果参见附件所示(不知道如何贴图啊)。
得到这个结果后,如何使用,大家就应该明白了。
本文介绍在Oracle数据库中生成32位唯一值的方法,解决分布式系统中主键冲突问题。通过使用sys_guid()函数,可以实现类似Hibernate的唯一值生成策略。
1876

被折叠的 条评论
为什么被折叠?



