我需要生成 id,生成规则由我定义。例如:
0x-111-111-PX-2013-11-11-00001
0x-111-111-PX-2013-11-11-00002
在单个 jvm 中很容易做到这一点。问题是,我需要跨 jvm。
跨 jvm 意味着从不同的机器生成唯一的 id
生成随机数或随机字符串 (UUID) 始终是一项挑战。即便是平时java.util.Random
也不完美。您已经排除了使用可以确保跨 JVM 的随机性的数据库。
这个问题类似于web 容器生成唯一会话 id所面临的挑战。只要涉及单个 JVM,就可以保证唯一性。但在现实世界的情况下,情况并非如此。典型的 Web 应用程序部署在服务器集群中。根据会话 ID,负载均衡器将请求转发到适当的服务器。
由于跨 JVM 不能保证会话 id 的唯一性,因此每个服务器都会在会话 id 上附加一个唯一标识符(例如 .node1),以确保即使两个服务器生成相同的会话 id,附加的字符串也会保留唯一性。
将此扩展到您的情况,您始终可以将 JVM 特定标识符放在 id 中,因此生成的 id 可能如下所示,
您可以将 M1/M2 放在字符串中的任何位置。
我不知道您可能有任何强迫症(在 ID 上),但这只是一个想法。
1)您可以使用带有存储过程的数据库,该存储过程将根据需要生成下一个 id
2) Java 应用程序(服务)运行仅用于 id 生成目的,可通过例如 RMI 访问
3) 其他 java 应用程序将使用相同算法更新的共享文件