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

标签 database hibernate oracle11g

我正在集群环境中开发 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/

相关文章:

java - 有没有一种简单的方法可以在 Oracle 中克隆表的结构?

database - 如何使用事务数据库创建临界区?

mongodb - 这在 MongoDB 中意味着什么?

java - 使用 HQL 进行内部连接

java - Hibernate对于Web应用程序更安全吗?

php - 最符合标准的数据库

java - EntityManager 始终为 null 并且未正确注入(inject)

sql - 通过 Oracle 的解释计划查询的总成本

database - 仅对表中的一列授予更改权限

java - 如何提高 oracle 中简单选择查询的性能