业务unique ID的生成策略分析

业务unique ID的生产策略分析

需求上下文:

业务是和单个user相关的(userId),业务表分到10个DB host中

 需求:

 高并发下生产唯一的业务ID

首先根据此用户的userId mapping到不同的DB host(oracle), 

每个DB host上有一个业务seq,  这个seq自增步长是10,然后每个host起点不一样, 0 是0, 1是1,这样每个 DB host生成的seq数据就不会冲突(host1上只会生产尾数为1的seq,host2上只会生产尾数为2的seq,类推)

具体生产seq的oracle sql为:

SELECT  BUSINESS_ID_SEQ_0.NEXTVAL FROM dual   //生成一个

SELECT  BUSINESS_ID_SEQ_0.NEXTVAL FROM dual CONNECT BY LEVEL <= 100  //生成100个

查询的时候每次seq生成100个,缓存到本地内存中的队列(ConcurrentLinkedQueue), 下次就从内存中取了

但这个code中的synchronized锁加的很奇怪, ConcurrentLinkedQueue是在锁的代码块内部使用的, 但如果上下文环境是安全的,ConcurrentLinkedQueue这个高并发队列不就没意义了吗,

个人觉得加锁应该只加在从数据库拿100个seq的时候加,防止多个线程同时去数据库创建100个seq,导致重复创建。在那之外的获取seq其实不用加锁的,因为ConcurrentLinkedQueue已经是线程安全。

猜你喜欢

转载自renxiangzyq.iteye.com/blog/2358073