分布式数据库主键id生成策略
分布式数据库部署主要分为两种,一种是读写分离。这个需要弄主从数据库。主要是写的时候写主数据库,读的时候读从数据库。分散读取压力,对于读多写少的系统有利于
提高其性能。还有一种是分布式存储,这种主要是将一张表拆分成多张分表部署到各个服务器中,主要针对写操作频繁的系统,如微博,淘宝的订单系统。
这两种方案都会遇到主键类型及生成方式的问题,还有主从数据库不同步和主键冲突问题。
主键类型主要有GUID和数字类型,这里我们不讨论GUID;
数字主键主要存在唯一性、可同步性两个方面的不足
可同步性:可以不使用主键自增方案。
唯一性:可以单独使用存储过程生成ID,设置主键ID的初始值步长和最大值,及所对应的表,当然主从数据库的主表和分表初始值和最大值是不一样的,一样的话会造成主键重复。
存储过程:
-- ----------------------------
-- Procedure structure for getId
-- ----------------------------
DROP PROCEDURE IF EXISTS `getId`;
DELIMITER ;;
CREATE DEFINER=`sawyer`@`%` PROCEDURE `getId`(OUT aId INT, OUT aIdEnd INT, aType TINYINT)
BEGIN
DECLARE id,eid,iStep INT;
DECLARE rev TINYINT;
SELECT Current_ID,END,Step,REVERSE INTO id,eid,iStep,rev FROM t_id WHERE TYPE=aType;
IF id<eid THEN
SET aId = id;
IF id+iStep >= eid THEN
SET aIdEnd = eid;
IF rev = 1 THEN
UPDATE t_id SET Current_ID=Start_ID WHERE TYPE=aType;
ELSE
UPDATE t_id SET Current_ID=eid WHERE TYPE=aType;
END IF;
ELSE
SET aIdEnd = id+iStep;
UPDATE t_id SET Current_ID=aIdEnd WHERE TYPE=aType;
END IF;
ELSE
SET aId = 0, aIdEnd = 0;
END IF;
END
;;
DELIMITER ;
主表

从表

写一个java类去调用这个存储过程生成主键。
/* */ package btir.dao.jdbc;
/* */
/* */ import btir.BtirException;
/* */ import btir.dao.ha.DBMgr;
/* */ import btir.dao.ha.PooledStmt;
/* */ import btir.utils.MiscUtil;
/* */ import org.apache.commons.logging.Log;
/* */ import org.apache.commons.logging.LogFactory;
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/* */ public class IdHolder
/* */ {
/* */ public static final int NO_ID_AVAILABLE = 0;
/* 19 */ private static final Log log = LogFactory.getLog(IdHolder.class);
/* */
/* */
/* */
/* */ private int current;
/* */
/* */
/* */ private int end;
/* */
/* */
/* */
/* */ public synchronized int getId(byte type, int stmtId)
/* */ {
/* 32 */ if (end <= current)
/* */ {
/* */ try
/* */ {
/* 36 */ PooledStmt stmt = DBMgr.borrowSingleStmt(stmtId);
/* */
/* */
/* 39 */ stmt.setByte(3, type);
/* 40 */ stmt.executeUpdate();
/* 41 */ current = stmt.getInt(1);
/* 42 */ end = stmt.getInt(2);
/* 43 */ stmt.returnMe();
/* */ } catch (BtirException e) {
/* 45 */ current = (end = 0);
/* 46 */ log.error("can't get id for type=" + type);
/* 47 */ log.error(MiscUtil.traceInfo(e));
/* 48 */ return 0;
/* */ }
/* 50 */ if (end <= current)
/* 51 */ return 0;
/* */ }
/* 53 */ return current++;
/* */ }
/* */
/* */ public synchronized int getId(byte type, PooledStmt stmt) {
/* 57 */ if (end <= current) {
/* */ try {
/* 59 */ stmt.setByte(3, type);
/* 60 */ stmt.executeUpdate();
/* 61 */ current = stmt.getInt(1);
/* 62 */ end = stmt.getInt(2);
/* */ } catch (BtirException e) {
/* 64 */ current = (end = 0);
/* 65 */ return 0;
/* */ }
/* 67 */ if (end <= current)
/* 68 */ return 0;
/* */ }
/* 70 */ return current++;
/* */ }
/* */ }
上面这段代码主要是调用存储过程,对应配置的表的ID自增。。。
分布式数据库主键id生成策略的更多相关文章
- 数据库主键ID生成策略
前言: 系统唯一ID是我们在设计一个系统的时候常常会遇见的问题,下面介绍一些常见的ID生成策略. Sequence ID UUID GUID COMB Snowflake 最开始的自增ID为了实现分库 ...
- 数据库分库分表(一)常见分布式主键ID生成策略
主键生成策略 系统唯一ID是我们在设计一个系统的时候常常会遇见的问题,下面介绍一些常见的ID生成策略. Sequence ID UUID GUID COMB Snowflake 最开始的自增ID为了实 ...
- mybatis 针对SQL Server 的 主键id生成策略
SQL Server中命令: select newId() ,可以得到SQL server数据库原生的UUID值,因此我们可以将这条指令写到 Mybatis的主键生成策略配置selectKey中. ...
- Hibernate系列之ID生成策略
一.概述 hibernate中使用两种方式实现主键生成策略,分别是XML生成id和注解方式(@GeneratedValue),下面逐一进行总结. 二.XML配置方法 这种方式是在XX.hbm.xml文 ...
- JPA ID生成策略(转---)
尊重原创:http://tendyming.iteye.com/blog/2024985 JPA ID生成策略 @Table Table用来定义entity主表的name,catalog,schema ...
- 分库分表的 9种分布式主键ID 生成方案,挺全乎的
<sharding-jdbc 分库分表的 4种分片策略> 中我们介绍了 sharding-jdbc 4种分片策略的使用场景,可以满足基础的分片功能开发,这篇我们来看看分库分表后,应该如何为 ...
- hibernate(四)ID生成策略
一.ID生成策略配置 1.ID生成方式在xml中配置方式: <?xml version="1.0"?> <!DOCTYPE hibernate-mapping P ...
- 业务ID 生成策略
业务ID 生成策略,从技术上说,基本要借助一个集中式的引擎来帮忙实现. 为了扩大业务ID生成策略的并发问题,还有更为技巧性的提升. 先来介绍普遍的分布式ID生成策略: 1. 利用DB的自增主键 这里又 ...
- Rhythmk 学习 Hibernate 03 - Hibernate 之 延时加载 以及 ID 生成策略
Hibernate 加载数据 有get,跟Load 1.懒加载: 使用session.load(type,id)获取对象,并不读取数据库,只有在使用返回对象值才正真去查询数据库. @Test publ ...
随机推荐
- AT command常用中文简解
1.常用操作1.1 AT命令解释:检测 Module 与串口是否连通,能否接收 AT 命令:命令格式:AT<CR>命令返回:OK (与串口通信正常) (无返回,与串 ...
- 各种api接口
实用号码归属地查询(IP 地址,手机号码): 默认格式: http://api.liqwei.com/location/ (使用来访者的 IP 地址) 指定 IP 地址格式: http://api.l ...
- 判断asp.net中session过期的方法
判断asp.net中session过期的方法 转载自:http://www.cnblogs.com/xilipu31/archive/2013/04/12/3016830.html 方法一:最麻烦也是 ...
- 数据库 Oracle数据库性能优化
--在Oacle数据库涉及到全表扫描的SQL查询(top,count)中, --现场用户删除表中大部分数据,只保留1W条数据,但是查询仍然很慢,检查磁盘IO,发现磁盘IO不是很高 --经过分析Oacl ...
- Omnigraffle快捷键
cmd+shift+. 和 cmd+shift+, 放大缩小 按住z点击鼠标是放大, z+Option是缩小 按住command双指推移 缩放 按住command,旋转物体 按住 option缩放 ...
- imx6 android5.1 编译
imx6 android5.1 编译 记录一下编译imx6dl android的命令. Android build cd ~/myandroid source build/envsetup.sh lu ...
- Unity3D深入浅出 -组件与节点之间的调用关系
一.transform组件用途 1.维护场景树 2.对3D物体的平移,缩放,旋转 二.场景树定义 在Hierarchy视图中显示的: 一个game_scene场景,下面有Main Camera节点,D ...
- ubuntu安裝 R RStudio
sudo apt--i386.deb ref: http://blog.csdn.net/lichangzai/article/details/39376117
- CentOS系统资源常用命令
系统: # uname -a # 查看内核/操作系统/CPU信息 # cat /etc/issue # cat /etc/redhat-release # 查看操作系统版本 # cat /proc ...
- ajax异步加载回跳定位
1)首先,问题是这样的:page1在一个滚动到页面底部加载更新的函数(功能),当页面滚动了第二页(或更多页)时,点击链接跳转到了其他页面(page2),在page2有返回按钮,当从page2返回pag ...