UUID和数据库的主键策略

今天在看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());
}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值