生成全局ID的方法很多, 这里记录下一种简单的方案: 利用mysql的自增id生成全局唯一ID.

1. 创建一张只需要两个字段的表:

CREATE TABLE `guid` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `stub` char(1) NOT NULL DEFAULT '' COMMENT '桩字段,占坑的', PRIMARY KEY (`id`), UNIQUE KEY `uk_stub` (`stub`) -- 将 stub 设为唯一索引) ENGINE=MyISAM AUTO_INCREMENT=1000000000 DEFAULT CHARSET=utf8;

2. 定义 mybatis mapper:

@Mapperpublic interface GuidMapper { /**获取全局唯一ID  * @return  */ // replace into afs_guid(stub) values('a'); // select last_insert_id(); @Insert("REPLACE INTO guid (stub) VALUES('a')") @SelectKey(statement = {"SELECT LAST_INSERT_ID()"}, keyProperty = "guidHolder.id", before = false, resultType = long.class) int getGuid( @Param("guidHolder") GuidHolder guidHolder); @Data public static class GuidHolder{  private long id;  private String stub; }
 GuidMapper.GuidHolder guidHolder = new GuidMapper.GuidHolder(); int i = guidMapper.getGuid(guidHolder); long     guid   = guidHolder.getId(); // guid 就是返回的ID

并发安全问题

REPLACE INTO 类似于 INSERT 是安全的. 不只是它会先判断主键或唯一键是否重复, 重复, 则删除原有的, 新增一条, 替换原来的.

SELECT LAST_INSERT_ID() 是和mysql连接绑定的, 当前连接上, 操作触发了auto_increment值改变, 得到新的数值, 这个数值, 只会被当前连接可见. 其他连接也只会拿到它改变auto_increment后的值.

更多相关文章

  1. 链接器解析多重定义的全局变量
  2. Android(安卓)全局异常处理(二)
  3. Android全局异常统一处理
  4. 【Android(安卓)内存优化】Bitmap 内存缓存 ( Bitmap 内存复用 |
  5. 说说在 Android(安卓)如何在全局获取 Context
  6. android使用全局变量的两种方法
  7. Android双屏异显
  8. android入门知识:android使用全局变量
  9. Android开发效率—Eclipse快捷键

随机推荐

  1. ?android:attr/属性 与 ?android:属性
  2. 【转】android manifest.xml中元素含义
  3. Android OpenGL ES学习笔记之实现OpenGL
  4. android 获取手机通讯录信息
  5. Activity背景色为透明的2种方法
  6. android activity tabhost
  7. Android软件安装文件夹
  8. Android安全问题
  9. Android——从init进程启动流程
  10. android studio开发 控件布局