一种简单的ID生成策略: Mysql表生成全局唯一ID的实现
16lz
2021-12-15
生成全局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后的值.
更多相关文章
- 链接器解析多重定义的全局变量
- Android(安卓)全局异常处理(二)
- Android全局异常统一处理
- 【Android(安卓)内存优化】Bitmap 内存缓存 ( Bitmap 内存复用 |
- 说说在 Android(安卓)如何在全局获取 Context
- android使用全局变量的两种方法
- Android双屏异显
- android入门知识:android使用全局变量
- Android开发效率—Eclipse快捷键