记一次shardingJDBC主键生成策略没有生效问题

二、Sharding-JDBC系列02:自定义主键生成策略 实际应用中,大部分场景按照MySQL主键ID自增就能满足需求,但是在分库分表后,MySQL的自增主键就不能使用了,为了避免重复,我们需要全局唯一的ID,比如会员表的会员ID、订单表的订单ID等。// UUID: 采用UUID.randomUUID()的方式产生分布式主键// SNOWFLAKE: 雪花算法,生成64bit的长整型数据还抽离出分布式主键生成器的接口,方便用户自行实现自定义的自增主键生成器。 阅读详情
pom.xml

         <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.25</version>
        </dependency>

        <!--JDBC-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.6</version>
        </dependency>

        <!--sharding-->
        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
            <version>4.1.1</version>
        </dependency>

        <!--mybatis-plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.3.2</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
application.properties
#配置真实数据源
spring.shardingsphere.datasource.names=m1

#配置数据源
spring.shardingsphere.datasource.m1.type= com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.m1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.m1.url=jdbc:mysql://localhost:3306/coursedb?serverTimezone=GMT%2B8
spring.shardingsphere.datasource.m1.username=root
spring.shardingsphere.datasource.m1.password=123456

# 指定表的分布情况 配置表在哪个数据库里,表名是什么。水平分表,分两个表:m1.course_1,m1.course_2  course逻辑表 物理表course_1
spring.shardingsphere.sharding.tables.course.actual-data-nodes=m1.course_$->{1..2}


# 指定表的主键生成策略
# 指定主键
spring.shardingsphere.sharding.tables.course.key-generator.column=cid
# 指定生成算法 SNOWFLAKE:雪花算法  UUID算法
spring.shardingsphere.sharding.tables.course.key-generator.type=SNOWFLAKE
#雪花算法的一个可选参数
spring.shardingsphere.sharding.tables.course.key-generator.props.worker.id =1


#指定分片策略 约定cid值为偶数添加到course_1表。如果是奇数添加到course_2表。
# 分片键:inline模式下按id分表
spring.shardingsphere.sharding.tables.course.table-strategy.inline.sharding-column=cid
# 根据计算的字段算出对应的表名。分片算法:ID取摩
spring.shardingsphere.sharding.tables.course.table-strategy.inline.algorithm-expression=course_$->{cid%2+1}

# 打开sql日志输出。
spring.shardingsphere.props.sql.show=true


spring.main.allow-bean-definition-overriding=true

实体类

public class Course {

    //@TableId
    private long cid;

    private String cname;

    private long userId;

    private String cstatus;

    public Long getCid() {
        return cid;
    }

    public void setCid(Long cid) {
        this.cid = cid;
    }

    public String getCname() {
        return cname;
    }

    public void setCname(String cname) {
        this.cname = cname;
    }

    public Long getUserId() {
        return userId;
    }

    public void setUserId(Long userId) {
        this.userId = userId;
    }

    public String getCstatus() {
        return cstatus;
    }

    public void setCstatus(String cstatus) {
        this.cstatus = cstatus;
    }

    @Override
    public String toString() {
        return "Course{" +
                "cid=" + cid +
                ", cname='" + cname + '\'' +
                ", userId=" + userId +
                ", cstatus='" + cstatus + '\'' +
                '}';
    }
}

Mapper

public interface CourseMapper extends BaseMapper<Course> {

}

springboot 启动类:

@SpringBootApplication
@MapperScan("com.shardingsphere.sharding_jdbc.Mapper")
public class ShardingJdbcApplication {

    public static void main(String[] args) {
        SpringApplication.run(ShardingJdbcApplication.class, args);
    }

}

测试类:

@SpringBootTest
@RunWith(SpringRunner.class)
class ShardingJdbcApplicationTests {


    @Resource
    private CourseMapper courseMapper;


    @Test
    public void add(){

        for (int i=0;i<10;i++){
            Course course = new Course();
            course.setCname("java");
            course.setUserId(100L);
            course.setCstatus("1");
            courseMapper.insert(course);
        }
    }



}

结果运行报错:

2022-03-28 15:11:17.947  INFO 53545 --- [           main] ShardingSphere-SQL                       : Logic SQL: INSERT INTO course  ( cid,
cname,
user_id,
cstatus )  VALUES  ( ?,
?,
?,
? )
2022-03-28 15:11:17.948  INFO 53545 --- [           main] ShardingSphere-SQL                       : SQLStatement: InsertStatementContext(super=CommonSQLStatementContext(sqlStatement=org.apache.shardingsphere.sql.parser.sql.statement.dml.InsertStatement@71c0b742, tablesContext=org.apache.shardingsphere.sql.parser.binder.segment.table.TablesContext@3bbb8c16), tablesContext=org.apache.shardingsphere.sql.parser.binder.segment.table.TablesContext@3bbb8c16, columnNames=[cid, cname, user_id, cstatus], insertValueContexts=[InsertValueContext(parametersCount=4, valueExpressions=[ParameterMarkerExpressionSegment(startIndex=64, stopIndex=64, parameterMarkerIndex=0), ParameterMarkerExpressionSegment(startIndex=67, stopIndex=67, parameterMarkerIndex=1), ParameterMarkerExpressionSegment(startIndex=70, stopIndex=70, parameterMarkerIndex=2), ParameterMarkerExpressionSegment(startIndex=73, stopIndex=73, parameterMarkerIndex=3)], parameters=[0, java, 100, 1])], generatedKeyContext=Optional[GeneratedKeyContext(columnName=cid, generated=false, generatedValues=[0])])
2022-03-28 15:11:17.948  INFO 53545 --- [           main] ShardingSphere-SQL                       : Actual SQL: m1 ::: INSERT INTO course_1  ( cid,
cname,
user_id,
cstatus )  VALUES  (?, ?, ?, ?) ::: [0, java, 100, 1]


org.springframework.dao.DuplicateKeyException: 
### Error updating database.  Cause: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '0' for key 'PRIMARY'

根据报错信息得知,是表的cid 没有设置自增id,其实不然。在application.properties配置中我们已经采用了  shardingJDBC集成的 SNOWFLAKE(雪花算法),但是该主键生成策略没有生效,即使将表的cid 改为 自增,也会得到 分表不成功, 数据将全部存入course_1 表中。

分析实际执行SQL得到:Actual SQL: m1 ::: INSERT INTO course_1  ( cid,cname,user_id,cstatus )  VALUES  (?, ?, ?, ?) ::: [0, java, 100, 1] 

怎么cid插入的0 然后仔细检查代码发现 实体类中 应该使用 LONG 类型而不是 long类型

如下:


public class Course {

    //@TableId
    private Long cid;

    private String cname;

    private Long userId;

    private String cstatus;
}

启动运行test , 发现表中数据已经插入:

 

4. sharding-jdbc源码之分布式ID 阿飞Javaer,转载请注明原创出处,谢谢! 实现动机 传统数据库软件开发中,主键自动生成技术是基本需求。而各大数据库对于该需求也提供了相应的支持,比如MySQL的自增键。 对于MySQL而言,分库分表之后,不同表生成全局唯一的Id是非常棘手的问题。因为同一个逻辑表内的不同实际表之间的自增键是无法互相感知的, 这样会造成重复Id的生成。我们当然可以通过约束表生成键的规则来达到数据的不重... 阅读详情

相关推荐

基于当当开源shardingjdbc的分库分表的配置-单主键分库分表策略配置

由于最近在做公司各种中间件的替换方案调研,其中就有调研到当当已经开源的shardingjdbc。 今天搞了一天,从一头雾水到慢慢的拨开了迷雾。 最搞的是,分库分表规则的配置,结合我们自己的实际使用场景,分库分表规则采用的是单一主键,并不是gitgub上提供的demo,采用userid分库,orderid分表的策略。 着实被搞了一天。 官网的配置如下。 bean id=

bingpao_zml的博客 4929

shardingjdbc使用时间范围查询分表不生效

但是跑起来后发现一个问题,TMD id能够正常分表, but: 时间不行。=================== 分割线 ========================初始化的时候完成的,所以继续往上翻,找到 optimizedStatement 的初始化代码。使用了id和时间分别。时间sql执行时走到这里可以断住,但是走不到我们的分表策略,所以断下继续分析。首先断在分表策略那里,因为id可以正常分表,所以断住后直接看堆栈。负责创建分表条件对象,如过创建失败了,则不参与分表。,重启项目,一切正常。

jioulongzi的专栏 1526

【教程】shardingjdbc(五)默认策略配置

默认数据源如何选择的 假设又有一个user表;对于user表因为数据量比较小,是不需要配置分片的; 主要的配置信息为: 1. 2个数据源 2. 只对order 进行分表; spring: application: name: shardingjdbcDemo main: allow-bean-definition-overriding: true shardingsphere: #数据源信息 datasource: #名称为dbsou

愤怒的菜鸟博客 4117

ShardingSphere-JDBC的 SPI主键生成策略

ShardingSphere主键生成策略就是使用雪花算法和UUID两种方式。这两种主要就是通过SPI的方式实现,其主要目的也是为了好扩展,也可以自行实现接口,自定义主键生成策略。 插入日志输出:

不管风吹浪打,胜似闲庭信步 3523

ShardingJdbc

httphttpshttps以下来自官网的原话ApacheShardingSphere是一套开源的分布式数据库解决方案组成的生态圈,它由JDBC、Proxy和Sidecar(规划中)这3款既能够独立部署,又支持混合部署配合使用的产品组成。它们均提供标准化的数据水平扩展、分布式事务和分布式治理等功能,可适用于如Java同构、异构语言、云原生等各种多样化的应用场景。复制是异步的从站不需要永久连接以接收来自主站的更新。......

weixin_40108868的博客 1990

ShardingJDBC分库分表实战

ShardingSphere分库分表的核心概念 虚拟库: ShardingSphere的核心就是提供一个具备分库分表功能的虚拟库,他是一个ShardingSphereDatasource实例。应用程序只需要像操作单数据源一样访问这个ShardingSphereDatasource即可。示例中,MyBatis框架并没有特殊指定DataSource,就是使用的ShardingSphere的DataSource数据源。 真实库: 实际保存数据的数据库。这些数据库都被包含在ShardingSphereDatasou

qq_45061342的博客 1972

数据库分库分表(sharding)(二) 全局主键生成策略

第一部分:一些常见的主键生成策略 一旦数据库被切分到多个物理结点上,我们将不能再依赖数据库自身的主键生成机制。一方面,某个分区数据库自生成的ID无法保证在全局上是唯一的;另一方面,应用程序在插入数据之前需要先获得ID,以便进行SQL路由。目前几种可行的主键生成策略有: 1. UUID:使用UUID作主键是最简单的方案,但是缺点也是非常明显的。由于UUID非常的长,除占用大量存储

zyxNobita专栏 1078

分享一次 ShardingJDBC 亿级数据分表真实经验

从入职以来写了一年的业务代码,突然接到来自领导的技术需求,说要给我们的借款、还款申请单分表。查看了一下借款表,只有几千万数据,再看还款表已经两亿多了,为了提高数据查询效率,降低数据库的压力。确实可以考虑分表了。另外......这是入职一年以来第一个非业务需求!回想在进公司之前,面试的时候经常会有问到分库分表的面试官,问的完全不知道怎么回答。因为没有过实际的经验,那时候总感觉分库分表是个很难很难,很高大上的东西。

lingqu+wx bjmsb06 1257

ShardingJDBC

定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务。它使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架。适用于任何基于 JDBC 的 ORM 框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template 或直接使用 JDBC;支持任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, HikariCP 等;支持任意实现 JDBC 规范的

worn_xiao的博客 1万+

基于AutoDL复现A-LOAM

Ceres solver 是谷歌开发的一款用于非线性优化的库,在谷歌的开源激光雷达slam项目cartographer中被大量使用。在autodl上面租服务器,地区我租的重庆A区的,GPU我选择的是RTX4090,基础镜像选择的是Miniconda / conda3 / 3.8(ubuntu20.04)/11.6。在AutoDL中我使用的方式是先将该数据集先下载到自己的电脑上,然后再上传到虚拟机中。用MobaXterm解决该问题!搜到的一个解决方式:该问题属于ceres版本问题,将A-LOAM下的。

m0_61281610的博客 1943

MDM主数据清洗和编码集成说明

绝大多数的企业业务系统是伴随业务发展而建设的,但随着业务发展单一系统难以支撑企业业务闭环。MDM主数据管理平台可以满足企业数据治理的需求,本文针对主数据清洗和编码集成进行梳理。...

数通畅联 3321

ShardingJDBC实战指南

ShardingJDBC实战指南

程序员码小跳 4676

PCIe信号眼图总是不开?手把手教你调CTLE和DFE参数(附实测波形对比)

本文详细解析了PCIe信号眼图调试中CTLE和DFE参数的优化方法,帮助硬件工程师解决眼图无法张开的问题。通过实际案例和步骤指导,介绍了如何调整CTLE直流增益和DFE抽头系数,提升接收端均衡器性能,确保信号完整性。

weixin_26805597的博客 218

springboot集成shardingjdbc5.1.2版本自定义主键生成策略

springboot集成shardingjdbc5.1.2版本自定义主键生成策略

纯海洋之力的博客 448

遥感生态指数(RSEI)——四个指数的计算

遥感生态指数是在4个生态指数的基础上通过主成分变换得出的一个评价生态环境质量的指标。因此,第二部分就是要分别计算出这4个指数的值。 ①首先,是绿度指数的计算,一般用归一化植被指数(NDVI) NDVI=(NIR-Red)/(NIR+Red) 在Bandmath工具中输入NDVI计算公式 (float(b4-b3))/(b4+b3) 其中,b3、b4分别是红波段和近红外波段 ②其次,是湿度计算。 WET = c1B1 + c2B2 + c3B3...

qq_41978498的博客 9万+

基于MATLAB/Simulink的四旋翼无人机PID控制与仿真(3)

《基于MATLAB/Simulink的四旋翼无人机PID控制与仿真》的第三篇,将为大家继续展示并完善控制与仿真模型。本文将在前文的基础上,完成控制环节增补、参数设置、测试等工作,在不考虑性能(低超调、快、准等)的前提下,保证系统对于一般输入(阶跃、斜坡)的响应稳定性。

jlx142857的博客 9322

shardingjdbc+mybatisplus自set主键不插入

因为业务发展,个别数据表业务量增速过快,已达到分库分表需要,于是引入shardingjdbc组件进行分表,但是发现之前mybatis生成的数据表对应实体类主键id可以通过自己set值来实现自定义主键,尽管字段上写了注解 @Table(type=IdType.AUTO) private int id; user.setId(100); userMapper.save(user); INSERT INTO USER(id,name) VALUES(100,'张三') 引入sharding-jdbc后,发现

qq446152019的博客 1144

手把手教你:在openEuler 22.03上离线搞定OpenSSH 9.8升级(CentOS 7.9通用)

本文详细介绍了在openEuler 22.03和CentOS 7.9系统上离线升级OpenSSH 9.8的完整流程,包括准备工作、离线包获取、安装步骤、服务管理及回滚方案。特别针对无外网环境的企业服务器,提供安全可靠的离线升级解决方案,帮助运维人员有效提升系统安全性。

weixin_30682415的博客 192

【踩坑】ShardingJdbc实现自动生成主键时,根据雪花算法生成的主键值存放在别的字段上了

ShardingJdbc实现自动生成主键时,根据雪花算法生成的主键值存放在别的字段上了

MS_SONG的博客 1081

408 | 408常用计算公式与方法 —— 计组篇 汇总

408常用计算公式与方法 —— 计算机组成原理篇 汇总

"You are worthy! You can do it!" 4658

基于高频变压器的隔离式推挽栅极驱动电路

摘要:本文介绍了一种基于高频变压器的隔离式推挽栅极驱动电路,通过变压器实现电气隔离,为功率MOS管提供可靠驱动信号。电路包含输入侧PWM信号处理、变压器磁耦合隔离传输以及副边驱动逻辑等关键部分,利用电阻电容网络控制开关速度并防止误触发。该隔离驱动方案广泛应用于高压开关电源、新能源汽车电机控制器、光伏逆变器和工业变频器等需要高电压隔离及抗干扰能力的电力电子设备中,有效保障系统安全性和可靠性。

qq_37999850的博客 487

分库分表—ShardingJDBC

定位为轻量级 Java框架,在 Java 的 JDBC层提供的额外服务,它使用客户端直连数据库,以 jar包形式提供服务,无需额外部署和依赖,可理解为增强版的 JDBC驱动,完全兼容 JDBC 和各种 ORM框架。适用于任何基于 JDBC 的 ORM框架,如:JPA、Hibernate、Mybatis、Spring JDBC Template 或是直接使用 JDBC;支持任何第三方的数据库连接池,如:DBCP、C3P0、BoneCP、HikariCP 等;

Eris_QwQ的博客 1626

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

shardingjdbc分库分表----自定义生成主键

shardingjdbc分库分表----自定义生成主键 每天多学一点点~ 话不多说,这就开始吧… 文章目录shardingjdbc分库分表----自定义生成主键1.前言2. proerties配置文件3. spi自定义主键生成的类4. 结语 1.前言 好久没写博客了,主要是新入职的公司太忙,被996摧残了两个多月之后,再也不想去大厂了。。。最近滴滴出事,隔壁的T3出行开始007了好像,资本是真的可怕,手动狗头。。。 吐槽完毕,今天正好闲暇,之前写过一篇 ShardingSphere分库分表----取模和按日

爆裂无球的程序空间 1989

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

一篇文章快速入门ShardingJDBC

水平分库包含了分库策略和分表策略.分库策略 ,目的是将一个逻辑表 , 映射到多个数据源#===============水平分库-分库策略==============#----分片列名称----#----分片算法配置----#分片算法名称 -> 行表达式分片算法#分片算法类型#分片算法属性配置分表策略, 如何将一个逻辑表 , 映射为多个 实际表#===============水平分库-分表策略==============#----分片列名称----##----分片算法配置----

weixin_53818428的博客 1113

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

基于ShardingJDBC的分库分表

基于ShardingJDBC的分库分表 前言 传统应用项目设计通常都是采用单一数据库作为存储方案,但是随着互联网的迅猛发展以及应用数据量的增长,数据库会随着数据量的增长而渐渐成为整个应用框架的性能瓶颈。 首先是由于关系学数据库大多是采用B+Tree类型的索引,当数据量超过一定的阈值之后,会导致索引的深度增长,而索引的深度又直接影响了磁盘IO操作的次数,直接影响了数据库查询性能的优劣。 其次由于用户数量的提升,高并发的数据库请求也会越来越多,单节点数据库的连接数、TPS以及存储容量都存在上限的限制,并发数达到

小熊的博客 5023
上一篇: URI expanded = this.getUriTemplateHandler().expand(url, uriVariables);
wangrongfei136
博客等级 码龄12年 1粉丝 37原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值