为实体生成唯一ID

时间:2018-01-08 10:08:45

标签: java lagom

我正在开发Lagom项目,其中一项要求是唯一标识每个用户的文档。

每次用户添加文档时,文档都会生成一个ID。

我的想法很简单,可以保证ID的唯一性:

  • 生成随机字符串ID(NOT UUID)
  • 在数据库中查询生成的ID
  • IF查询返回0次点击然后ID是唯一的,我应该将其返回给调用者
  • 如果查询返回1,则重复所有步骤。

我已实施DocumentEventProcessor extends ReadSideProcessor<DocumentEvent>DocumentRepository 能够查询数据库。

我的问题是如何编写迭代(递归可能)查询数据库的函数,直到新的随机ID返回。

4 个答案:

答案 0 :(得分:0)

为什么不使用while循环?

SaveDocumentWithNewId(){
//what pseudocode. 
String newRandomId = null;
while(result.size() != 0 )
newRandomId = GenerateRandomID();
ArrayList result= queryToDatabase(newRandomId);
}

document.setId(newRandomId );
}

答案 1 :(得分:0)

您不应使用读取方(即您的数据库)来保证ID的唯一性。在Lagom(以及任何基于CQRS的系统)中,读取方将始终只是最终一致。因此,您最终可能会遇到两个节点生成相同ID的情况,数据库会告诉它它不存在,因为它还没有赶上。

您需要做的是确保您可以区分新创建的未使用的PersistentEntity,以及已经拥有与之关联的文档的PersistentEntityRegistry。然后使用PersistentEntity获取新生成的密钥的PersistentEntityRegistry。如果实体已存在,则生成新密钥。如果没有,你有钥匙。

算法 - 生成新ID,直到找到未使用的ID - 保持不变,只需确保使用set doc=C:\xampp\htdocs\bot cd "%doc%" copy /y nul "file.php" ECHO ^<?php echo 'This is executed via scheduler task!'; ?^> >file.php schtasks /create /tn "Cron" /tr "C:\xampp\php\php-win.exe http://localhost/bot.php" /sc minute /mo 1 检查唯一性,而不是读取端。

答案 2 :(得分:0)

成本高昂的流程通过搜索数据库来检查生成的ID是否唯一。我建议您创建自己的 UUID(如GUID),它应该系统间唯一,并且也基于要求(即7个字符长)。

您可以通过获取系统的inetAddress并附加一个随机数来创建自己的ID,然后从中生成一个消息摘要,然后根据您的要求,您可以从中删除7个字符。

通过这样做,您将在整个系统中拥有独特的ID,并满足您的要求。

供参考click here

答案 3 :(得分:0)

也许您可以使用以下方法:

假设:
- 分布式系统,
- 7个字符长ID,
- 您可以为每个节点分配一个唯一值 - hostId(可能是主机IP的最后一位数字?)

怎么做:
- 每个节点有一个Singleton,它将生成ID,
- 通过将hostId和当前时间以毫秒级联来计算uniqueNumericID(您应该存储上次使用的时间戳,以防每毫秒需要多个ID,只需将最后一个值添加一个,直到上一个时间戳&gt; =当前时间戳)。登记/> - 将此数值(十进制)转换为基数为62的数字(使用字符'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'并反复计算(其余的)值的模数,使用模数作为字符的索引)。

7个字符长的ID应该有足够的空间。