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

文章讲述了在使用ShardingJdbc时,如何配置雪花算法ID生成策略以确保主键插入到正确字段的问题,强调了配置默认数据源、分表规则以及worker.id和max.vibration.offset参数的重要性。

问题

ShardingJdbc 生成雪花算法id主键时,插入到表中的数据显示生成的内容存放在别的字段上
在这里插入图片描述

正确的应该是:

image-20231222140841230

原因

生成雪花算法id时候,其他属性值也要填写默认值,否则,id就会生成到别的属性列的位置 这里找了好久这个问题

实现效果

image-20231222141005321

image-20231222141018046

代码

sharding配置:根据年月分表

    # 配置默认数据源ds1
    sharding:
      # 默认数据源,主要用于写,注意一定要配置读写分离 ,注意:如果不配置,那么就会把三个节点都当做从slave节点,新增,修改和删除会出错。
      default-data-source-name: ds1
      # 配置分表规则
      tables:
        # order 逻辑表名
        # 订单表按照 年月分表  生成表名 order_202101,order_202102,order_202103,order_202201,order_202202,order_202203
        order:
          # 最后一部分 ${ 生成一个从1到3的数字序列,然后将每个数字转换为字符串,并在左边填充0,使其总长度为2 }
          actual-data-nodes
Sharding-JDBC是一个开源的分布式数据库中间件,提供了分库分表、读写分离等功能。它通过雪花算法(Snowflake)生成全局唯一的主键,并支持批量插入操作。 ### 雪花算法(Snowflake) 雪花算法是一种生成分布式唯一ID的算法,具有以下特点: 1. **全局唯一性**:生成的ID在整个分布式系统中是唯一的。 2. **有序性**:生成的ID是递增的,便于数据库索引。 3. **高可用性**:算法不依赖于数据库,适合高并发场景。 雪花算法的ID生成规则如下: - 1位符号位:始终为0。 - 41位间戳:毫秒级间戳。 - 10位机器ID:包括5位数据中心ID和5位机器ID。 - 12位序列号:同一毫秒内的序列号。 ### Sharding-JDBC生成主键 Sharding-JDBC通过雪花算法生成主键,并将其作为分布式数据库中的唯一标识。具体步骤如下: 1. **配置雪花算法**:在Sharding-JDBC的配置文件中,配置雪花算法的相关参数,如数据中心ID、机器ID等。 2. **生成主键**:在插入数据,Sharding-JDBC会自动调用雪花算法生成一个唯一的ID,并将其赋主键字段。 ### 批量插入 Sharding-JDBC支持批量插入操作,可以将多条记录一次性插入到数据库中。批量插入的优点包括: 1. **减少数据库连接数**:一次插入多条记录,减少了与数据库的交互次数。 2. **提高性能**:批量插入可以显著提高数据插入的速度。 ### 示例代码 ```java import io.shardingsphere.api.config.ShardingRuleConfiguration; import io.shardingsphere.shardingjdbc.api.ShardingDataSourceFactory; import org.apache.commons.dbcp.BasicDataSource; import javax.sql.DataSource; import java.sql.Connection; import java.sql.PreparedStatement; import java.util.HashMap; import java.util.Map; import java.util.Properties; public class ShardingJDBCExample { public static void main(String[] args) throws Exception { // 配置数据源 Map<String, DataSource> dataSourceMap = new HashMap<>(); BasicDataSource dataSource = new BasicDataSource(); dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUrl("jdbc:mysql://localhost:3306/test_db"); dataSource.setUsername("root"); dataSource.setPassword("password"); dataSourceMap.put("ds0", dataSource); // 配置分片规则 ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration(); // 配置雪花算法生成主键 Properties props = new Properties(); props.setProperty("worker.id", "0"); props.setProperty("datacenter.id", "0"); shardingRuleConfig.setDefaultKeyGenerator("io.shardingsphere.core.keygen.DefaultKeyGenerator", props); // 创建ShardingDataSource DataSource shardingDataSource = ShardingDataSourceFactory.createDataSource(dataSourceMap, shardingRuleConfig, new Properties()); // 执行批量插入 String sql = "INSERT INTO users (id, name, age) VALUES (?, ?, ?)"; try (Connection conn = shardingDataSource.getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql)) { for (int i = 0; i < 100; i++) { pstmt.setLong(1, 0); // 主键字段设置为0,由Sharding-JDBC自动生成 pstmt.setString(2, "name" + i); pstmt.setInt(3, 20 + i); pstmt.addBatch(); } pstmt.executeBatch(); } } } ```
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码元宋大米

感谢小主大赏,留言可进互助群~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值