为什么要通过第三方生成主键:
海量数据一般要应用分库,分表策略,如用户表分成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"}));
}
分享到:
相关推荐
该项目是基于MySQL的分布式序列号生成组件设计源码,包含30个文件,包括24个Java源文件、3个XML配置文件、1个Git忽略文件、1个LICENSE文件和1个Markdown文档。它适用于微服务环境,旨在简化连续序列号的生产过程,并...
一个简单的JAVA版的DAO生成器,通过反射机制获取bean实体类属性,前提是bean属性都有自动生成的getters和setters。 之前由于一个bean实体类就要写一个DAO,实在是没有效率,就想了这个方法,反射机制获取私有属性的...
这个是用mysql写的存储过程,搭配里面一张数据表使用,达到高并发情况下获得唯一订单号的目的;原理:按照一定规则生成订单号后,把订单号插入数据表后,再返回给用户,由于数据表设置了主键,也就是当数据表中存在...
文件"serialNum"可能包含了作者实现序列号生成的一些代码片段或工具。要获取更多具体信息,你需要访问提供的博客链接或者查看该文件内容。 总之,Java生成数据库表序列号涉及到数据库设计、JDBC操作、ORM框架的使用...
然而,关于压缩包中提到的序列号生成器,需要注意的是,使用非官方的序列号生成器可能涉及版权问题,违反软件许可协议,甚至可能导致计算机安全风险,如病毒或恶意软件。官方版本通常会提供试用期,若需要长期使用,...
总结,MySQL实现的雪花算法能够有效解决分布式系统中的ID生成问题,通过巧妙地结合时间戳、节点标识和序列号,既保证了ID的全局唯一性,又确保了高并发下的生成效率。尽管存在时间回拨的潜在风险,但通过合理的策略...
* 获得序列号,同时更新持久化存储中的序列 * @param current 当前的日期 * @param start 初始化的序号 * @return 所获得新的序列号 */ protected abstract int getOrUpdateNumber(Date current, int start);
8. **报告和图表**:Navicat可以生成各种统计报告和图表,帮助用户分析和理解数据。 9. **数据可视化**:提供图表和仪表盘功能,使用户能以图形方式查看数据,提升数据分析效率。 10. **安全性**:Navicat支持设置...
分布式架构中的全局唯一序列号生成是一个关键问题,特别是在大规模并发的场景下,保证序列号的唯一性和高效生成是系统设计的重要考量。本文档主要对比分析了几种常见的解决方案,并结合携程的实践经验进行了深入探讨...
MySQL全局ID生成方法是数据库设计中的一个重要议题,特别是在大规模分布式系统中,确保ID的全局唯一性和高并发下的高效生成是数据库架构的关键要素。以下是一些常见的全局ID生成策略: 1. **基于CAS(Check and Set...
- 由于我们要频繁地生成序列号,所以使用预编译的SQL语句可以提高效率。通过`PreparedStatement`对象,我们可以创建一个模板SQL语句,其中包含占位符,然后在每次使用时填充实际值。 3. **自增字段**: - 在MySQL...
分布式架构下,唯一序列号生成是我们在设计一个系统,尤其是数据库使用分库分表的时候常常会遇见的问题。当分成若干个sharding表后,如何能够快速拿到一个唯一序列号,是经常遇到的问题。在携程账号数据库迁移MySQL...
- 在MySQL版本5.7.8之后,可以使用窗口函数`ROW_NUMBER()`来更直观地实现序列号的生成,如`ROW_NUMBER() OVER (ORDER BY some_column)`,这种方式更为标准且性能优秀。 ### 总结 MySQL提供了多种方式来为查询结果...
通过在窗口函数中定义排序规则,可以为每行生成唯一的序列号,这在并发环境下非常有效。 `readme.txt`文件可能包含了关于如何使用这些脚本和策略的详细说明,包括如何初始化序列、如何在应用程序中安全地获取新的ID...
"xsequence-master.zip" 提供了一个解决方案,它利用MySQL作为基础,构建了一个分布式序列号生成组件。下面将详细讨论相关知识点。 1. **分布式序列号生成**: 在分布式环境中,各个服务节点独立运行,生成序列号...
3. **数据源支持**:CodeSmith可以连接到各种数据库,如SQL Server、Oracle、MySQL等,直接从中提取表结构和数据,生成相应的数据访问层代码。 4. **集成开发环境(IDE)插件**:CodeSmith 6.0可与Visual Studio...
3. 编写脚本或程序,读取MySQL数据,根据MySQL的主键值生成Oracle的序列号。 4. 插入数据到Oracle,并确保主键值的连续性。 总的来说,MySQL到Oracle的数据同步是一项技术挑战,涉及数据库结构的比较、数据类型映射...
imiskolee-seqno作为一个开源的分布式自增序列生成器,结合了MySQL的稳定性和分布式系统的灵活性,为开发人员提供了一种简单而高效的方法来解决序列号生成的问题。通过理解其工作原理和使用方式,我们可以更好地将其...
7. **序列号生成器**:标题中提到的“序列号生成器”可能是指Navicat7内置的功能,用于自动生成数据库中的唯一标识,这在创建主键或唯一索引时非常有用。 8. **数据传输**:在不同数据库间进行数据和结构的迁移,...