今天在看Spring3.x企业级开发一书中说:“数据库层主键方案”已经成为历史的遗留产物,他的缺点和不足已经随着应用层的发展不断凸显,其一:不方便应用开发,因为你必须通过一个查询获取新增的数据主键;其二,吧方便主键值的全局管理和控制,使系统丧失灵活性;其三,不方便数据的整合和迁移。
因为现在的数据一般比较大,数据库著就爱你开始肩负起更多的功能,包括数据库切分、资源定位等。在牵扯点大数据分布式时这个特点更明显了,书中提到UUID,我就google了一下,找到如下的方案,看下面的介绍 :
应用程序中主键ID生成与UUID
1.ID生成策略
在一个数据库设计里,假如使用了逻辑主键,那么你一般都需要一个ID生成器去生成逻辑主键。
在许多数据库里面,都提供了ID生成的机制,如Oracle中的sequence,MSSQL中的identity,可惜这些方法各种数据库都不同的,所以很多
人愿意找寻一种通用的方式。
编写代码,1、2、3……这样一直累加是最直接的想法,JAVA用以下方式去实现
private static AtomicInteger uniqueId = new AtomicInteger(0);
public static String nextId() {
return Integer.toString(uniqueId.incrementAndGet());
}
当然,这样太简单了,并且一重新启动,计数器就归 0 了,一般的做法可以用 时间 + 计数器 的方式,
2.集群环境ID生成
在一个群集的环境里面,通常还需要加上IP的前缀,即 IP + 时间 + 计数器,这个就是JAVA原版本的实现了。
3.UUID
UUID(Universally Unique Identifier)全局唯一标识符,是指在一台机器上生成的数字,它保证对在
同一时空中的所有机器都是唯一的。按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址
、纳秒级时间、芯片ID码和许多可能的数字。由以下几部分的组合:当前日期和时间(UUID的第一个部
分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同)
,时钟序列,全局唯一的IEEE机器识别号(如果有网卡,从网卡获得,没有网卡以其他方式获得),
UUID的唯一缺陷在于生成的结果串会比较长。
//d68de284-475e-41d6-b193-da8cc5052a79
在Java中生成UUID主要有以下几种方式:
1. JDK1.5
如果使用的JDK1.5的话,那么生成UUID变成了一件简单的事,以为JDK实现了UUID: java.util.UUID,直接调用即可.
UUID.randomUUID().toString()
//d68de284-475e-41d6-b193-da8cc5052a79
2. 第三方开源类库(推荐使用):
最著名的是 JUG .特点上是: 纯Java实现,开源,LGPL协议。采用了Native的方式产生真正的Uuid.而
且提供了不同平台的实现,包括:
Linux / x86
Windows (98, ME, NT, 2K, XP?) / x86
Solaris / Sparc
Mac OS X
FreeBSD / x86
import org.safehaus.uuid.UUID;
import org.safehaus.uuid.UUIDGenerator;
public class Test {
public static void main(String[] args){
//http://jug.safehaus.org/
UUIDGenerator g=UUIDGenerator.getInstance();
UUID uuid=g.generateRandomBasedUUID();
System.out.println(uuid.toString());
}
}