前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一次深夜的分表demo

一次深夜的分表demo

作者头像
花花522
发布2023-03-07 16:07:24
6090
发布2023-03-07 16:07:24
举报
文章被收录于专栏:花花爱咖啡

起因

大概23:30左右,一位不知名的买家找到了我这个不知名的小店,发送了一句亲切的在吗

分析

首先拿到了我们的yaml,因为源码可能不太方便,所以只给了我yml,之后我分析了他的配置,我贴一下核心配置

因为工作中并没有用过sharding去进行分表的操作,所以为了学习就先应承下来了(不是为了单啊啊啊)

根据我的习惯,spring有自带的就先不导入其他依赖,所以我导入了如下依赖

代码语言:javascript
复制
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.1</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.6.6</version>
</dependency>

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

其中就有我们的sharding-jdbc-spring-boot-starter 我们使用的是4.1.1版本

我把他的配置文件复制进来 修改了数据库的信息,然后开始踩坑

坑1

首先我没有导入druid,所以肯定是不指定连接池的,按理来说会使用spring推荐的HikariCP

一把梭哈run起来

妥妥的报错

代码语言:javascript
复制
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.apache.shardingsphere.shardingjdbc.spring.boot.SpringBootConfiguration': Initialization of bean failed; nested exception is java.lang.NullPointerException

是有一些报错提示的,但是因为时间有点晚了,我明天补上这个问题

于是我去问客户,客户说能启动,于是我反手导入了客户用连接池

代码语言:javascript
复制
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.8</version>
</dependency>

加上了

代码语言:javascript
复制
type: com.alibaba.druid.pool.DruidDataSource

启动,正常run了

坑2

启动看似正常了,我新增数据

下次我一定截图,主要是小号微信电脑没登录,就懒得切号了

我尝试百度了一下,并没有找到想要的(PS:这个操作太小白了,shard都上了还不会排除,找不到很正常)

对比配置发现,emm,是我修改的问题,逻辑表名没有对应上

坑3

启动之后,我新增数据,发现update条数为2,按理来说不应该,于是我启用了sql打印

  • mybatis
代码语言:javascript
复制
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  • shard
代码语言:javascript
复制
spring:
  shardingsphere:
    props:
      sql:
        show: true

然后清晰的看到,执行了两张表的插入

直觉还是配置问题

我删除了用户的

代码语言:javascript
复制
      master-slave-rules:
        knowChat:
          master-data-source-name: db1
          slave-data-source-names: db1

这段,因为我并不知道在干嘛,主从?可能影响我运行的全部删掉

启动->开始报错

代码语言:javascript
复制
          actual-data-nodes: knowChat.kn_user_$->{0..1}

这次报错提示了,actual-data-nodes解析失败,说是异常的表达式,对照配置发现knowChat这个不能写死,需要使用定义的数据库的名称,放在这里是db1

收尾

之后我测试了新增和查询,都正常了,最终配置如下

代码语言:javascript
复制
spring:
  shardingsphere:
    datasource:
      names: db1
      db1:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/test-sharding?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&autoRecon
        username: root
        password: root
    sharding:
      #默认的数据源
      default-data-source-name: db1
      # 分表策略
      tables:
        # 指定某个表的分片配置
        tn_user:
          # 规则,使用Groovy语法
          # 这个配置是告诉sharding有多少个库和多少个表
          #          actual-data-nodes: knowChat$->{0..1}.kn_user_$->{0..1}
          #这里只分表不分库
          logic-table: tn_user
          actual-data-nodes: db1.tn_user_$->{0..1}
          table-strategy:
            inline:
              # 配置表分片的字段
              sharding-column: order_no
              # 配置表分片算法
              algorithm-expression: tn_user_$->{order_no % 2}
    props:
      sql:
        show: true
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

交付图如下

后续

不知道啦,配置已经发给客户了,等明有问题给他远程

PS:还没谈价格,应该不会坑吧哈哈

鸡汤来啦

撕一张日历,很简单,但把握住一天,却很难。新的日子定要充实自己,永远记住一句话:自律给我自由。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-04-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 花花爱咖啡 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 起因
  • 分析
  • 坑1
  • 坑2
  • 坑3
  • 收尾
  • 后续
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档