在我的项目中,我正在从一个数据库表中生成一个唯一的id,该表具有属性'serial_key‘的最大整数值,并将该数字加1。它正在生成唯一索引以添加新的记录元组。
但当我在内联网或互联网的多台PC上部署应用程序时,这种机制失败了,它在所有不同的机器上同时生成相同的唯一id。而且我在服务器中有大量的数据,所以我必须管理相同模式的id,因为它是以特定的格式构造的。请建议如何解决此问题。谢谢。
发布于 2013-08-26 14:11:01
您可以使用HiLo算法来生成唯一密钥。它可以针对性能或连续键进行调整。如果您在所有客户端(我猜是java和php)中都实现了它,那么您可以获得任意多个键的唯一键(或者您的数据库性能允许)。您也不需要依赖于任何数据库,如果针对吞吐量对其进行调优,则不需要太多额外的数据库查询。
请参阅此SO-Answer。
发布于 2013-08-26 14:15:15
您可以通过在serial_key列上使用AUTO_INCREMENT属性来解决此问题。这样你就不必担心数据冲突了。这是主键的常见做法。
发布于 2013-08-26 17:21:12
基于可移植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的hi-lo想法不同,它将键空间视为一个连续的线性数字行--它可以有效地分配可配置大小的小块。这些密钥是人类友好的,并且不会浪费大块。Ambler先生的想法分配了高16位或32位,并且需要丑陋的组合键或生成大的人类不友好的键值作为嗨字的增量。
已分配密钥的比较:
Linear_Chunk Hi_Lo
100 65536
101 65537
102 65538
.. server restart
120 131072
121 131073
122 131073
.. server restart
140 196608猜猜对于开发人员或数据库管理员来说,哪些键更容易使用。
实际上,我早在90年代就与他通信,向他建议这个改进的方案,但他太固执,不承认使用线性数字行的好处。
https://stackoverflow.com/questions/18437573
复制相似问题