群集环境中的数据库ID生成

时间:2012-06-06 21:06:10

标签: database hibernate oracle11g

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

1 个答案:

答案 0 :(得分: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并将其用于主键。这不如使用序列那么高效,它需要更多的空间,但它确实允许你拥有任意数量的机器。