`
锅巴49
  • 浏览: 160864 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

mysql 序列号生成办法

 
阅读更多

为什么要通过第三方生成主键:

 

海量数据一般要应用分库,分表策略,如用户表分成32张,每张数据量就小了,查询速度就会加快。

分表会碰到主键问题,要保证每张表的主键在32张表中都是唯一,你会随着业务量重新整合数据

32张表会变成64或更多,数据也可能要按新的规则存放,所以要保证主键唯一。

 

int型主键最利于索引和查询速度。有人会用uuid 32位字符串做主键,但这加大的索引存储,不利于查询优化

 

 

第一步:建表

 

 

CREATE TABLE `t_max_id` (
  `max_key` varchar(10) NOT NULL,
  `max_id` bigint(11) NOT NULL,
  PRIMARY KEY (`max_key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

 `max_key` 是业务类型

 `max_id` 是下一个id,按升序增加

 

  表类型用的InnoDB,支持事务

 

第二步:建存储过程

 

 

CREATE PROCEDURE `max_id`(p_max_key CHAR(10), OUT PARAM2 INT)
BEGIN
 START TRANSACTION;
	 SET @a= NULL;
	 SELECT max_id INTO @a FROM t_max_id WHERE max_key= p_max_key FOR UPDATE;
	 IF(@a IS NULL) THEN
	  SET @a=1;
	  INSERT INTO t_max_id(max_key,max_id) VALUES(p_max_key,2);
	 ELSE
	  UPDATE t_max_id SET max_id=max_id+1 WHERE max_key=p_max_key;
	 END IF;
	 SELECT @a INTO PARAM2;
 COMMIT;
END

 

select **** FOR UPDATE 是锁住当前结果集所在行,直到本事务COMMIT

 

第三步:java调用存储过程,取得某业务的主键id

 

 

@Test
	public void testCallPro(){
		  String param2Value = (String) jdbcTemplate.execute( 
				     new CallableStatementCreator() {
						public CallableStatement createCallableStatement(
								java.sql.Connection con) throws SQLException {
							// TODO Auto-generated method stub
							 String storedProc = "{call max_id(?,?)}";// 调用的sql 
					           CallableStatement cs = con.prepareCall(storedProc); 
					           cs.setString(1, "order");// 设置输入参数的值 
					           cs.registerOutParameter(2, java.sql.Types.INTEGER);// 注册输出参数的类型 
					         
							
							return cs;
						} 
				     }, new CallableStatementCallback() { 
				         public Object doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException { 
				           cs.execute(); 
				           return cs.getString(2);// 获取输出参数的值 
				     } 
				  }); 
		  
		  System.out.println(param2Value);
	}

 求 order 表的 主键

 

用的是spring jdbcTemplate

 

注意:

 

1、这种方式存在单点,所有的主键生成依赖某数据库,一时宕机将影响所有插入。

2、最好利地RMI提用服务,数据库只对某些ip的service提供调用存储过程服务,不提供insert,update,delete服务

 

-------------------------------------------------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------------------------------------------------

 

另一种简单调用办法

 

 

 

CREATE PROCEDURE `max_id`(p_max_key CHAR(10))

BEGIN
	
	START TRANSACTION;
	 
		SET @a= NULL;
		 
		SELECT max_id INTO @a FROM t_max_id WHERE max_key= p_max_key FOR UPDATE;
		 
		IF(@a IS NULL) THEN
		  
		SET @a=1;
		  
		INSERT INTO t_max_id(max_key,max_id) VALUES(p_max_key,2);
		 
		ELSE
		  
		UPDATE t_max_id SET max_id=max_id+1 WHERE max_key=p_max_key;
		 END IF;
		 
		SELECT @a AS max_id;
	 

	COMMIT;
    
END$$

DELIMITER ;
 

没有声明输出参数

 

 

@Test
	public void testCallPro2(){
		
		  System.out.println(jdbcTemplate.queryForInt("call max_id(?)",new Object[]{"order"}));
	}
 

 

 

分享到:
评论
1 楼 di1984HIT 2016-10-04  
学习了~~~~~~~~

相关推荐

    简单DAO生成器、创建器(只支持MySQL)Java版

    一个简单的JAVA版的DAO生成器,通过反射机制获取bean实体类属性,前提是bean属性都有自动生成的getters和setters。 之前由于一个bean实体类就要写一个DAO,实在是没有效率,就想了这个方法,反射机制获取私有属性的...

    MySQL高并发下生成唯一订单号的存储过程

    这个是用mysql写的存储过程,搭配里面一张数据表使用,达到高并发情况下获得唯一订单号的目的;原理:按照一定规则生成订单号后,把订单号插入数据表后,再返回给用户,由于数据表设置了主键,也就是当数据表中存在...

    分布式架构系统生成全局唯一序列号的一个思路

    分布式架构下,唯一序列号生成是我们在设计一个系统,尤其是数据库使用分库分表的时候常常会遇见的问题。当分成若干个sharding表后,如何能够快速拿到一个唯一序列号,是经常遇到的问题。在携程账号数据库迁移MySQL...

    MySQL连接客户端 Navicat7(mysql+gui)

    这是连接mysql的客户端,我们项目用的就是这款软件,非常好用,简单又快速!里面有序列号生成器,请大家放心使用!

    kepware sql数据库组态

    kepware sql数据库组态,转化为标准opc 这是一个序列号

    mysql网络数据库指南(中文版) part1

    7.3.1 生成历史同盟目录 218 7.3.2 发送成员资格更新通知 223 7.3.3 历史同盟成员项目编辑 227 7.3.4 寻找共同兴趣的历史同盟成员 231 7.3.5 联机历史同盟目录 232 7.4 在 Web 应用程序中使用 DBI 234 7.4.1 ...

    Navicat mysql中文版破解版

    7. 运行 Navicat 程序,在激活对话框中输入注册机生成的序列号。然后,请按住键盘的“Ctrl+Shift”键并使用鼠标点击“激活”按钮,这时会显示一个打开文件对话框,请在该对话框中选择第 5 步中保存的激活文件,如果...

    MYSQL网络数据库PDF学习资源

    3.8.4 增加序列号列 119 3.8.5 对某个已有的列进行排序 120 3.8.6 非正常次序的串 120 3.8.7 建立计数表 120 3.8.8 检查表是否存在 121 3.9 MySQL 不支持的功能 121 第4章 查询优化 125 4.1 使用索引 125 4.1.1 索引...

    xsequence-master.zip

    微服务时代,我们需要生产一个连续的序列号,变得比较麻烦。这里使用了Mysql简单的实现了一个简单的分布式序列号生成组件。后续还可以支持redis等其他高效中间件。

    JSPMaker(生成JSP代码)v1.1特别版.rar

    JSPMaker是一款JSP代码生成工具,它能够轻松从MYSQL/ORACLE中生成完整的JSP代码,打开编辑jmp文件,轻松浏览查看编辑网页中的数据库记录,让JSP开发者能够快速创建网站应用程序,这个是英文版,暂时没有汉化。...

    mysql 数据库函数模拟使用雪花算法

    snowflake 雪花算法 时间戳:当前时间- 1288834974657... 序列表:使用temp_sequence表生成序列号,并与4096取模 可以用于一些特殊的数据迁移场景,不使用程序进行数据写入。 可自行针对自己的生成算法进行调整

    如何在Hive、MySQL、Oracle中分别添加自增序号

    最近公司业务涉及到了在相应库中添加自增序号这种操作,闲暇之余,整理如下,仅供参考~ 一、Hive  1、首先在Hive中建立一个测试表 create table xzw(id int, name string) clustered by (id) into 2 buckets ...

    Mycat-server-1.6-RELEASE源码

    支持全局序列号,解决分布式下的主键生成问题。 分片规则丰富,插件化开发,易于扩展。 强大的web,命令行监控。 支持前端作为MySQL通用代理,后端JDBC方式支持Oracle、DB2、SQL Server 、 mongodb 、巨杉。 支持...

    PHPRunnerProv5.0.672特别版附注册机

    可以快速生成能够使用和修改MySQL数据库的PHP网页,实现对数据库的搜索、排序、编辑、删除和添加操作等 注册信息:用户名:jb51.net序列号:H155B8-4EMWTR-NTEZ60-NMH634-79EUDW-FJAQRW

    fantasyDanmaku:用于现场表演的实时用户评论显示系统

    相反,您应该随机生成序列号,并将这些随机序列号添加到表users属性reg_code中。 对于系统的用户,每个人都应该有一个序列号,并以其唯一的序列号以及自己指定的昵称和密码注册系统。 后端配置 您必须指定后端配置...

    Big_Data_Twelve_Step:使用尽可能多的 Hadoop 生态系统工具的字符识别项目

    Hive 生成​​的AVRO文件 Pig读取两个文件并加入序列号 R删除位图异常值 Hadoop两次 MR 运行去除了所有噪声点,只留下字符信息 Mahout执行 K-means 为每个字符创建一个集群 用于写出带有簇 ID 的点的序列文件 Spark ...

    ingestion_benchmark

    研究问题如果所有生产者都在一个节点上运行,那么将数据以多快的速度生成到Kafka / Kinesis中?设置 在每个实验中,由专用节点托管生产者,生产者将消息发送到摄取代理: Kafka在四个节点的集群上运行。 Kinesis每个...

    Mycat数据库中间件 v1.13

    支持全局序列号,解决分布式下的主键生成问题。 分片规则丰富,插件化开发,易于扩展。 强大的web,命令行监控。 支持前端作为mysq通用代理,后端JDBC方式支持Oracle、DB2、SQL Server、mongodb、巨杉。 支持...

    Mycat2数据库中间件-其他

    支持全局序列号,解决分布式下的主键生成问题。分片规则丰富,插件化开发,易于扩展。强大的web,命令行监控。支持前端作为mysq通用代理,后端JDBC方式支持Oracle、DB2、SQL Server、mongodb、巨杉。支持密码加密...

Global site tag (gtag.js) - Google Analytics