我正在集群环境中开发 Web 应用程序。问题是我们需要为每个创建的实体生成一个 ID。我们处在一个有许多数据库节点的环境中,这些节点都在相互流式传输。我的想法是一个带有偏移量的序列。因此,一个站点的 ID 以 1 结尾,下一个以 2 结尾,依此类推。这似乎是一个笨拙的解决方案,因为您受限于多种环境。当您处于受干扰的数据库环境中时,确保生成唯一主键的“最佳”方法是什么?
最佳答案
就我个人而言,我更喜欢带有偏移量的序列。是的,您只能使用一定数量的环境,但实际上,您通常可以从一开始就进行设置,以便可用环境的数量远远超过您真正需要的数量。如果你做类似的事情
在站点 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 并将其用于您的主键。这不如使用序列高效,并且需要更多空间,但它确实允许您拥有任意数量的机器。
关于集群环境中的数据库 ID 生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10922291/