分布式数据库部署主要分为两种,一种是读写分离。这个需要弄主从数据库。主要是写的时候写主数据库,读的时候读从数据库。分散读取压力,对于读多写少的系统有利于

提高其性能。还有一种是分布式存储,这种主要是将一张表拆分成多张分表部署到各个服务器中,主要针对写操作频繁的系统,如微博,淘宝的订单系统。

这两种方案都会遇到主键类型及生成方式的问题,还有主从数据库不同步和主键冲突问题。

主键类型主要有GUID和数字类型,这里我们不讨论GUID;

数字主键主要存在唯一性、可同步性两个方面的不足

可同步性:可以不使用主键自增方案。

唯一性:可以单独使用存储过程生成ID,设置主键ID的初始值步长和最大值,及所对应的表,当然主从数据库的主表和分表初始值和最大值是不一样的,一样的话会造成主键重复。

存储过程:

  1. -- ----------------------------
  2. -- Procedure structure for getId
  3. -- ----------------------------
  4. DROP PROCEDURE IF EXISTS `getId`;
  5. DELIMITER ;;
  6. CREATE DEFINER=`sawyer`@`%` PROCEDURE `getId`(OUT aId INT, OUT aIdEnd INT, aType TINYINT)
  7. BEGIN
  8. DECLARE id,eid,iStep INT;
  9. DECLARE rev TINYINT;
  10. SELECT Current_ID,END,Step,REVERSE INTO id,eid,iStep,rev FROM t_id WHERE TYPE=aType;
  11. IF id<eid THEN
  12. SET aId = id;
  13. IF id+iStep >= eid THEN
  14. SET aIdEnd = eid;
  15. IF rev = 1 THEN
  16. UPDATE t_id SET Current_ID=Start_ID WHERE TYPE=aType;
  17. ELSE
  18. UPDATE t_id SET Current_ID=eid WHERE TYPE=aType;
  19. END IF;
  20. ELSE
  21. SET aIdEnd = id+iStep;
  22. UPDATE t_id SET Current_ID=aIdEnd WHERE TYPE=aType;
  23. END IF;
  24. ELSE
  25. SET aId = 0, aIdEnd = 0;
  26. END IF;
  27. END
  28. ;;
  29. DELIMITER ;

主表

从表

写一个java类去调用这个存储过程生成主键。

  1. /* */ package btir.dao.jdbc;
  2. /* */
  3. /* */ import btir.BtirException;
  4. /* */ import btir.dao.ha.DBMgr;
  5. /* */ import btir.dao.ha.PooledStmt;
  6. /* */ import btir.utils.MiscUtil;
  7. /* */ import org.apache.commons.logging.Log;
  8. /* */ import org.apache.commons.logging.LogFactory;
  9. /* */
  10. /* */
  11. /* */
  12. /* */
  13. /* */
  14. /* */
  15. /* */
  16. /* */ public class IdHolder
  17. /* */ {
  18. /* */ public static final int NO_ID_AVAILABLE = 0;
  19. /* 19 */ private static final Log log = LogFactory.getLog(IdHolder.class);
  20. /* */
  21. /* */
  22. /* */
  23. /* */ private int current;
  24. /* */
  25. /* */
  26. /* */ private int end;
  27. /* */
  28. /* */
  29. /* */
  30. /* */ public synchronized int getId(byte type, int stmtId)
  31. /* */ {
  32. /* 32 */ if (end <= current)
  33. /* */ {
  34. /* */ try
  35. /* */ {
  36. /* 36 */ PooledStmt stmt = DBMgr.borrowSingleStmt(stmtId);
  37. /* */
  38. /* */
  39. /* 39 */ stmt.setByte(3, type);
  40. /* 40 */ stmt.executeUpdate();
  41. /* 41 */ current = stmt.getInt(1);
  42. /* 42 */ end = stmt.getInt(2);
  43. /* 43 */ stmt.returnMe();
  44. /* */ } catch (BtirException e) {
  45. /* 45 */ current = (end = 0);
  46. /* 46 */ log.error("can't get id for type=" + type);
  47. /* 47 */ log.error(MiscUtil.traceInfo(e));
  48. /* 48 */ return 0;
  49. /* */ }
  50. /* 50 */ if (end <= current)
  51. /* 51 */ return 0;
  52. /* */ }
  53. /* 53 */ return current++;
  54. /* */ }
  55. /* */
  56. /* */ public synchronized int getId(byte type, PooledStmt stmt) {
  57. /* 57 */ if (end <= current) {
  58. /* */ try {
  59. /* 59 */ stmt.setByte(3, type);
  60. /* 60 */ stmt.executeUpdate();
  61. /* 61 */ current = stmt.getInt(1);
  62. /* 62 */ end = stmt.getInt(2);
  63. /* */ } catch (BtirException e) {
  64. /* 64 */ current = (end = 0);
  65. /* 65 */ return 0;
  66. /* */ }
  67. /* 67 */ if (end <= current)
  68. /* 68 */ return 0;
  69. /* */ }
  70. /* 70 */ return current++;
  71. /* */ }
  72. /* */ }

上面这段代码主要是调用存储过程,对应配置的表的ID自增。。。

分布式数据库主键id生成策略的更多相关文章

  1. 数据库主键ID生成策略

    前言: 系统唯一ID是我们在设计一个系统的时候常常会遇见的问题,下面介绍一些常见的ID生成策略. Sequence ID UUID GUID COMB Snowflake 最开始的自增ID为了实现分库 ...

  2. 数据库分库分表(一)常见分布式主键ID生成策略

    主键生成策略 系统唯一ID是我们在设计一个系统的时候常常会遇见的问题,下面介绍一些常见的ID生成策略. Sequence ID UUID GUID COMB Snowflake 最开始的自增ID为了实 ...

  3. mybatis 针对SQL Server 的 主键id生成策略

    SQL Server中命令: select newId()  ,可以得到SQL server数据库原生的UUID值,因此我们可以将这条指令写到 Mybatis的主键生成策略配置selectKey中. ...

  4. Hibernate系列之ID生成策略

    一.概述 hibernate中使用两种方式实现主键生成策略,分别是XML生成id和注解方式(@GeneratedValue),下面逐一进行总结. 二.XML配置方法 这种方式是在XX.hbm.xml文 ...

  5. JPA ID生成策略(转---)

    尊重原创:http://tendyming.iteye.com/blog/2024985 JPA ID生成策略 @Table Table用来定义entity主表的name,catalog,schema ...

  6. 分库分表的 9种分布式主键ID 生成方案,挺全乎的

    <sharding-jdbc 分库分表的 4种分片策略> 中我们介绍了 sharding-jdbc 4种分片策略的使用场景,可以满足基础的分片功能开发,这篇我们来看看分库分表后,应该如何为 ...

  7. hibernate(四)ID生成策略

    一.ID生成策略配置 1.ID生成方式在xml中配置方式: <?xml version="1.0"?> <!DOCTYPE hibernate-mapping P ...

  8. 业务ID 生成策略

    业务ID 生成策略,从技术上说,基本要借助一个集中式的引擎来帮忙实现. 为了扩大业务ID生成策略的并发问题,还有更为技巧性的提升. 先来介绍普遍的分布式ID生成策略: 1. 利用DB的自增主键 这里又 ...

  9. Rhythmk 学习 Hibernate 03 - Hibernate 之 延时加载 以及 ID 生成策略

    Hibernate 加载数据 有get,跟Load 1.懒加载: 使用session.load(type,id)获取对象,并不读取数据库,只有在使用返回对象值才正真去查询数据库. @Test publ ...

随机推荐

  1. mysql 创建新用户并添加权限

    1.添加用户 1.1 添加一个新用户: mysql>grant usage on *.* to " with grant option; 上面这种只支持mysql服务器本地登录. 1. ...

  2. 关于Cocos2d-x中音效重复播放问题的解决

    在做一些动作的时候,有时候只希望播放一次音效,但是触发音效的前提条件是要按着某个按钮,如果直接把播放音效的语句写在MOVED的case中,就会重复播放音效 解决方法就是把播放音效的语句写在BEGAN的 ...

  3. Intellij Idea14 jstl标签的引入

    习惯了eclipse和myeclipse开发的我们总是依赖于系统的插件,而当我想当然的以为IntelliJ IDEA 的jstl 的使用应该和myeclispe一样,当时使用起来却到处碰壁,完全找不到 ...

  4. Unable to resolve target 'android-20'

    使用eclipse编写android的app时,出现错误:Unable to resolve target 'android-20'. 参看链接: http://blog.csdn.net/u0134 ...

  5. ubuntu下使用VI编辑文件必知的常用命令

    进入vi的命令 vi filename :打开或新建文件,并将光标置于第一行首 vi +n filename :打开文件,并将光标置于第n行首 vi + filename :打开文件,并将光标置于最后 ...

  6. Pacbio 纯三代组装复活草基因组

    对于植物等真核生物基因组来说,重复序列, 多倍体,高杂合度等特征在利用二代数据进行组装的时候都会有很大的问题: 利用二代数据组装出来的基因组,大多达不到完成图的水准,通常只是覆盖到编码蛋白的基因区域, ...

  7. CentOS开关机命令

    命令简介 shutdown,poweroff,reboot,halt,init都可以进行关机,大致用法. /sbin/halt     [-n] [-w] [-d] [-f] [-i] [-p] [- ...

  8. 单例模式(singleton pattern)--------创造型模式

    缺点: 1.单例模式没有抽象层,单例模式的扩展较困那(开闭原则) 2.单例类的职责过重,既提供了业务方法,又提供了创建对象的方法,将对象的创建和对象本身的功能耦合在一起(违反单一职责原则,但是似乎又无 ...

  9. HDFS特点

  10. .Net中的序列化和反序列化详解

    序列化通俗地讲就是将一个对象转换成一个字节流的过程,这样就可以轻松保存在磁盘文件或数据库中.反序列化是序列化的逆过程,就是将一个字节流转换回原来的对象的过程. 然而为什么需要序列化和反序列化这样的机制 ...