`
锅巴49
  • 浏览: 163901 次
  • 性别: 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  
学习了~~~~~~~~

相关推荐

    基于MySQL的分布式序列号生成组件设计源码

    该项目是基于MySQL的分布式序列号生成组件设计源码,包含30个文件,包括24个Java源文件、3个XML配置文件、1个Git忽略文件、1个LICENSE文件和1个Markdown文档。它适用于微服务环境,旨在简化连续序列号的生产过程,并...

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

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

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

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

    java生成数据库表序列号

    文件"serialNum"可能包含了作者实现序列号生成的一些代码片段或工具。要获取更多具体信息,你需要访问提供的博客链接或者查看该文件内容。 总之,Java生成数据库表序列号涉及到数据库设计、JDBC操作、ORM框架的使用...

    Navicat.Data.Modeler.2.1.7.x64英文版本及序列号生成器亲测好用2019年6月14日上传

    然而,关于压缩包中提到的序列号生成器,需要注意的是,使用非官方的序列号生成器可能涉及版权问题,违反软件许可协议,甚至可能导致计算机安全风险,如病毒或恶意软件。官方版本通常会提供试用期,若需要长期使用,...

    利用mysql实现的雪花算法案例

    总结,MySQL实现的雪花算法能够有效解决分布式系统中的ID生成问题,通过巧妙地结合时间戳、节点标识和序列号,既保证了ID的全局唯一性,又确保了高并发下的生成效率。尽管存在时间回拨的潜在风险,但通过合理的策略...

    JAVA版本的生成唯一编号

    * 获得序列号,同时更新持久化存储中的序列 * @param current 当前的日期 * @param start 初始化的序号 * @return 所获得新的序列号 */ protected abstract int getOrUpdateNumber(Date current, int start);

    NavicatMysql 最强MYSQL 管理工具,附带序列号,永久使用

    8. **报告和图表**:Navicat可以生成各种统计报告和图表,帮助用户分析和理解数据。 9. **数据可视化**:提供图表和仪表盘功能,使用户能以图形方式查看数据,提升数据分析效率。 10. **安全性**:Navicat支持设置...

    分布式架构系统生成全局唯一序列号的一些思路对比分析.docx

    分布式架构中的全局唯一序列号生成是一个关键问题,特别是在大规模并发的场景下,保证序列号的唯一性和高效生成是系统设计的重要考量。本文档主要对比分析了几种常见的解决方案,并结合携程的实践经验进行了深入探讨...

    Mysql全局ID生成方法

    MySQL全局ID生成方法是数据库设计中的一个重要议题,特别是在大规模分布式系统中,确保ID的全局唯一性和高并发下的高效生成是数据库架构的关键要素。以下是一些常见的全局ID生成策略: 1. **基于CAS(Check and Set...

    java通过Mysql实现类似oracle序列功能序列.rar

    - 由于我们要频繁地生成序列号,所以使用预编译的SQL语句可以提高效率。通过`PreparedStatement`对象,我们可以创建一个模板SQL语句,其中包含占位符,然后在每次使用时填充实际值。 3. **自增字段**: - 在MySQL...

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

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

    mysql简单实现查询结果添加序列号的方法

    - 在MySQL版本5.7.8之后,可以使用窗口函数`ROW_NUMBER()`来更直观地实现序列号的生成,如`ROW_NUMBER() OVER (ORDER BY some_column)`,这种方式更为标准且性能优秀。 ### 总结 MySQL提供了多种方式来为查询结果...

    Mysql(序列/ID)生成方案

    通过在窗口函数中定义排序规则,可以为每行生成唯一的序列号,这在并发环境下非常有效。 `readme.txt`文件可能包含了关于如何使用这些脚本和策略的详细说明,包括如何初始化序列、如何在应用程序中安全地获取新的ID...

    xsequence-master.zip

    "xsequence-master.zip" 提供了一个解决方案,它利用MySQL作为基础,构建了一个分布式序列号生成组件。下面将详细讨论相关知识点。 1. **分布式序列号生成**: 在分布式环境中,各个服务节点独立运行,生成序列号...

    CodeSmith 6.0 + 序列号

    3. **数据源支持**:CodeSmith可以连接到各种数据库,如SQL Server、Oracle、MySQL等,直接从中提取表结构和数据,生成相应的数据访问层代码。 4. **集成开发环境(IDE)插件**:CodeSmith 6.0可与Visual Studio...

    mysql-oracle数据同步

    3. 编写脚本或程序,读取MySQL数据,根据MySQL的主键值生成Oracle的序列号。 4. 插入数据到Oracle,并确保主键值的连续性。 总的来说,MySQL到Oracle的数据同步是一项技术挑战,涉及数据库结构的比较、数据类型映射...

    开源项目-imiskolee-seqno.zip

    imiskolee-seqno作为一个开源的分布式自增序列生成器,结合了MySQL的稳定性和分布式系统的灵活性,为开发人员提供了一种简单而高效的方法来解决序列号生成的问题。通过理解其工作原理和使用方式,我们可以更好地将其...

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

    7. **序列号生成器**:标题中提到的“序列号生成器”可能是指Navicat7内置的功能,用于自动生成数据库中的唯一标识,这在创建主键或唯一索引时非常有用。 8. **数据传输**:在不同数据库间进行数据和结构的迁移,...

Global site tag (gtag.js) - Google Analytics