2

我正在集群环境中开发一个 Web 应用程序。问题是我们需要为每个创建的实体生成一个 ID。我们处于一个有许多数据库节点的环境中,这些节点都相互流式传输。我的想法是一个带有偏移的序列。因此,一个站点的 ID 以 1 结尾,下一个以 2 结尾,依此类推。这似乎是一个笨拙的解决方案,因为您受限于多种环境。当您处于受干扰的数据库环境中时,保证生成唯一主键的“最佳”方法是什么?

4

1 回答 1

1

就个人而言,我更喜欢带有偏移的序列。是的,您受限于一定数量的环境,但实际上,您通常可以从一开始就进行设置,以便可用环境的数量远远大于您真正需要的数量。如果你做类似的事情

在站点 1

CREATE SEQUENCE sequence_name
  START WITH 1
  INCREMENT BY 1000;

在站点 2

CREATE SEQUENCE sequence_name
  START WITH 2
  INCREMENT BY 1000;

并且在您必须重新处理序列之前,您最多可以拥有 999 个站点。这通常绰绰有余。如果您认为您实际上可能有 1000 个站点,您可以简单地将增量设置为 10,000 或 100,000。给定一个序列可以生成的值的数量,即使您将增量设置为数百万,您仍然不会用完。实际上,在您遇到序列问题之前,您就会遇到处理过多站点的 Streams 问题。

如果您不想走这条路,另一种选择是使用SYS_GUID生成全局唯一 ID 并将其用作主键。这不如使用序列有效,并且需要更多空间,但它确实允许您拥有任意数量的机器。

于 2012-06-06T21:13:51.657 回答