为什么要通过第三方生成主键:
海量数据一般要应用分库,分表策略,如用户表分成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"}));
}
分享到:
相关推荐
一个简单的JAVA版的DAO生成器,通过反射机制获取bean实体类属性,前提是bean属性都有自动生成的getters和setters。 之前由于一个bean实体类就要写一个DAO,实在是没有效率,就想了这个方法,反射机制获取私有属性的...
这个是用mysql写的存储过程,搭配里面一张数据表使用,达到高并发情况下获得唯一订单号的目的;原理:按照一定规则生成订单号后,把订单号插入数据表后,再返回给用户,由于数据表设置了主键,也就是当数据表中存在...
分布式架构下,唯一序列号生成是我们在设计一个系统,尤其是数据库使用分库分表的时候常常会遇见的问题。当分成若干个sharding表后,如何能够快速拿到一个唯一序列号,是经常遇到的问题。在携程账号数据库迁移MySQL...
这是连接mysql的客户端,我们项目用的就是这款软件,非常好用,简单又快速!里面有序列号生成器,请大家放心使用!
kepware sql数据库组态,转化为标准opc 这是一个序列号
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 ...
7. 运行 Navicat 程序,在激活对话框中输入注册机生成的序列号。然后,请按住键盘的“Ctrl+Shift”键并使用鼠标点击“激活”按钮,这时会显示一个打开文件对话框,请在该对话框中选择第 5 步中保存的激活文件,如果...
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 索引...
微服务时代,我们需要生产一个连续的序列号,变得比较麻烦。这里使用了Mysql简单的实现了一个简单的分布式序列号生成组件。后续还可以支持redis等其他高效中间件。
JSPMaker是一款JSP代码生成工具,它能够轻松从MYSQL/ORACLE中生成完整的JSP代码,打开编辑jmp文件,轻松浏览查看编辑网页中的数据库记录,让JSP开发者能够快速创建网站应用程序,这个是英文版,暂时没有汉化。...
snowflake 雪花算法 时间戳:当前时间- 1288834974657... 序列表:使用temp_sequence表生成序列号,并与4096取模 可以用于一些特殊的数据迁移场景,不使用程序进行数据写入。 可自行针对自己的生成算法进行调整
最近公司业务涉及到了在相应库中添加自增序号这种操作,闲暇之余,整理如下,仅供参考~ 一、Hive 1、首先在Hive中建立一个测试表 create table xzw(id int, name string) clustered by (id) into 2 buckets ...
支持全局序列号,解决分布式下的主键生成问题。 分片规则丰富,插件化开发,易于扩展。 强大的web,命令行监控。 支持前端作为MySQL通用代理,后端JDBC方式支持Oracle、DB2、SQL Server 、 mongodb 、巨杉。 支持...
可以快速生成能够使用和修改MySQL数据库的PHP网页,实现对数据库的搜索、排序、编辑、删除和添加操作等 注册信息:用户名:jb51.net序列号:H155B8-4EMWTR-NTEZ60-NMH634-79EUDW-FJAQRW
相反,您应该随机生成序列号,并将这些随机序列号添加到表users属性reg_code中。 对于系统的用户,每个人都应该有一个序列号,并以其唯一的序列号以及自己指定的昵称和密码注册系统。 后端配置 您必须指定后端配置...
Hive 生成的AVRO文件 Pig读取两个文件并加入序列号 R删除位图异常值 Hadoop两次 MR 运行去除了所有噪声点,只留下字符信息 Mahout执行 K-means 为每个字符创建一个集群 用于写出带有簇 ID 的点的序列文件 Spark ...
研究问题如果所有生产者都在一个节点上运行,那么将数据以多快的速度生成到Kafka / Kinesis中?设置 在每个实验中,由专用节点托管生产者,生产者将消息发送到摄取代理: Kafka在四个节点的集群上运行。 Kinesis每个...
支持全局序列号,解决分布式下的主键生成问题。 分片规则丰富,插件化开发,易于扩展。 强大的web,命令行监控。 支持前端作为mysq通用代理,后端JDBC方式支持Oracle、DB2、SQL Server、mongodb、巨杉。 支持...
支持全局序列号,解决分布式下的主键生成问题。分片规则丰富,插件化开发,易于扩展。强大的web,命令行监控。支持前端作为mysq通用代理,后端JDBC方式支持Oracle、DB2、SQL Server、mongodb、巨杉。支持密码加密...