在我的项目中,我从数据库表生成一个唯一的id,获取属性'serial_key'的最大整数值,并为该数字加1。它正在生成唯一索引以添加新的记录元组。
但是当我在内联网或互联网上的多台PC上部署应用程序时,这种机制失败了,它在瞬间在所有不同的机器上生成相同的唯一ID。我在服务器中有大量数据,因此我必须管理相同的id模式,因为它是采用特定格式构建的。请建议如何解决此问题。感谢。
答案 0 :(得分:0)
您可以使用HiLo算法生成唯一键。它可以针对性能或连续键进行调整。如果你在所有客户端(我猜java和php)中实现它,你可以在任意数量的键上获得唯一键(或者你的数据库性能允许)。您也不会依赖任何数据库,如果您调整吞吐量,则不需要额外的数据库查询。
请参阅此SO-Answer。
答案 1 :(得分:0)
您可以使用serial_key
列中的AUTO_INCREMENT
属性来解决此问题。这样您就不必担心数据冲突了。这是主键的常见做法。
答案 2 :(得分:0)
正确"分配器表"便携式基于DB的密钥分配的设计:优先使用Scott Ambler的误导" hi-lo"想法。
create table KEY_ALLOC (
SEQ varchar(32) not null,
NEXT bigint not null,
primary key (SEQ)
);
分配下一个,比方说,20个密钥(然后在服务器中作为范围保存,并根据需要使用):
select NEXT from KEY_ALLOC where SEQ=?;
update KEY_ALLOC set NEXT=(old value+20) where SEQ=? and NEXT=(old value);
假设您可以提交此事务(使用重试来处理争用),您已经分配了20个密钥&可以根据需要分发它们。
此方案比从Oracle序列分配快10倍,并且在所有数据库中100%可移植。
与Scott Ambler的高概念不同,它将键空间视为连续的线性数字线 - 从中有效地分配了可配置大小的小块。这些键是人性化的,不会浪费大块。 Ambler先生的想法是分配高16位或32位,并且需要丑陋的复合键或生成大的人类不友好的键值作为hi-words增量。
分配密钥的比较:
Linear_Chunk Hi_Lo
100 65536
101 65537
102 65538
.. server restart
120 131072
121 131073
122 131073
.. server restart
140 196608
猜测哪些密钥更易于为开发人员或数据库管理员使用。
我实际上是在90年代与他通信,向他推荐这个改进的计划,但他太过困难了。顽固地承认使用线性数字线的优点。