Java 如何生成唯一ID';在web服务器集群上的

Java 如何生成唯一ID';在web服务器集群上的,java,sql,database,jakarta-ee,cluster-computing,Java,Sql,Database,Jakarta Ee,Cluster Computing,在以下场景中: 1数据库 4个Web服务器 Web服务器如何为数据库生成唯一ID以使其唯一?是的,可以使用自动增量,但这太容易被爬网/猜测等。因此,自动增量目前不是一个选项。使用UUID()。冲突不太可能发生,可以通过重新生成新的UUID来处理冲突,也可以通过为每个服务器连接唯一的id(如mac地址)来防止冲突:- 您可以使用UUID: import java.util.UUID; UUID uuid = UUID.randomUUID(); System.out.printl

在以下场景中:

1数据库 4个Web服务器

Web服务器如何为数据库生成唯一ID以使其唯一?是的,可以使用自动增量,但这太容易被爬网/猜测等。因此,自动增量目前不是一个选项。

使用UUID()。冲突不太可能发生,可以通过重新生成新的UUID来处理冲突,也可以通过为每个服务器连接唯一的id(如mac地址)来防止冲突:-

您可以使用UUID:

import java.util.UUID;        

UUID uuid = UUID.randomUUID();
System.out.println(uuid.toString());

如果您真的担心冲突,可以预先生成密钥并将它们存储在具有唯一索引的数据库表中。然后有一个定期作业,在停机期间填充表,并每隔一段时间删除/归档使用过的键。

您使用的是什么数据库系统?应用程序是否知道发出请求的服务器?您是让DB决定密钥,还是在代码中设置它


它可以像使用带有前缀的自动递增或第二个字段来指示请求密钥的服务器一样简单。

我不确定为什么自动递增或序列是不可接受的。您希望内部ID不可“猜测”?什么,就像这是一个账号,你不想让别人猜到一个有效的账号

好吧,除了已经提到的UUID之外,我想到了两个明显的可能性

  • 使用一个序列,然后生成一个随机数,并使用一种算法从这两个序列的组合中创建帐号,这样两个不同的序列号就不能给出相同的最终数字。例如,一个简单的算法是:取下一个序列号,乘以12345678,生成一个从0到12345678-1的随机数,然后将两者相加

  • 在数据库中有一个表,其中有一条记录,保存最后分配的编号。每次需要新号码时,锁定此记录,使用上一个值生成下一个值,然后更新记录。只要数字一直在增加,就保证不会有重复


  • 如果您有一些使用服务器标识符作为标识符一部分的方案,我建议您不要让该标识符仅仅是存储在某个配置文件中的数字。我现在正在开发一个系统,有人想出了一个好主意,给每台服务器一个内置的“服务器id”来记录id,服务器id是一个手动分配的小整数。在只有3台服务器的生产环境中,这并不难。但是在开发和测试中,新的服务器总是上下浮动,测试配置文件也经常被丢弃,管理起来很痛苦。我会避免使用服务器id周期,但如果要使用,请让它由某个中央服务器自动分配,或从IP派生,或其他安全的方法。

    可以,但这是相同的问题。你仍然会遇到很多冲突,因为你不能保证ID在不同的服务器上是唯一的…@Stephanie:你确定吗?从>,它们显然是独一无二的。您的体验是否不同?UUID“保证”是唯一的,即使它们是在不同的服务器中创建的。冲突的可能性很小。构造UUID时,大多数O/S实现都会包含来自与主机关联的以太网卡的以太网硬件地址(也称为MAC地址),因此将MAC地址连接到UUID不会获得任何好处(但使用更大的标识符会减慢速度)。不需要附加MAC地址。如果您使用的是
    randomUUID
    ,那么从统计上看,数百年来您不太可能看到任何碰撞。只要在id列上放置一个唯一的约束,并适当地处理错误(如果发生)。对,但是如何防止冲突呢?随着数据库越来越满,冲突只会增加,因此性能会下降…@Stephane:如果你使用
    randomUUID
    ,那么从统计上看,几百年来你不太可能看到任何冲突。只要在id列上设置一个唯一的约束,并适当地处理错误(如果发生的话)。尽管理论上冲突是可能的,在应用程序的生命周期内,即使发生一次碰撞的概率也非常小。@Stephen可能没有您想象的那么小:@Stephen这实际上取决于数据的大小。对于此数据库,我们需要大量数据。请说明使用唯一ID解决的问题。这是一个内容管理系统吗?我不知道你还想要什么。。。对于后端数据库,id在多个J2EE服务器上需要是唯一的。为什么,虽然很重要,但实际上已经不再是一个选项。更重要的是我们如何做到这一点,无论是内容管理系统、博客、汽车商店在线系统、预订系统等等。
    import java.util.UUID;        
    
    UUID uuid = UUID.randomUUID();
    System.out.println(uuid.toString());