Sharding-JDBC使用心得

465 阅读2分钟

这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战

前言

业务背景是这样的,有一张mysql表记录mq消息的相关信息,消息id等。虽然只记录最近七天,但发现数据还是特别大。尽管对消息id建立索引了,查询依旧很慢。不得已分表了,对于这个只分表的小需求,立马就想到Sharding-JDBC这个轻量级的java框架了。

Sharding-JDBC

定位为轻量级Java框架,在Java的JDBC层提供的额外服务。 它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。

适用于任何基于Java的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC。
基于任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP等。
支持任意实现JDBC规范的数据库。目前支持MySQL,Oracle,SQLServer和PostgreSQL。

使用

配置

  sharding-sphere:
    datasource:
      names: ds
      ds:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.jdbc.Driver
        jdbc-url: jdbc:mysql://xxxxxxx:3306/xxxxx?useUnicode=true&characterEncoding=utf8&autoReconnect=true&failOverReadOnly=false&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT%2B8
        username: test_user
        password: test_pwd
    props:
      sql:
        show: true
    sharding:
      tables:
        consume_record:
          actual-data-nodes: ds.consume_record$->{0..7}
          tableStrategy:
            inline:
              sharding-column: id
              algorithm-expression: consume_record$->{id % 8}

datasource节点上配置数据源的,我这里只是简单的分表需求,不涉及分库。所以只配了一个数据源。
prop.sql.show是配置是否展示经过Sharding-JDBC处理后的sql。
下面的配置都是核心配置,配置分表的规则。这里要先规定好要分几张表,这里我们规定分八张表。所以这八张的表名就是consume_record后面加对应的数字。
规定好表之后,就该规定数据要按怎么样的规则去落库。因为我们的主键id是通过序列表获取可用id段,然后在插入方法的时候每次加一,拿id。这样就可以先拿到id,再通过id对8取模,这样就可以得到对应表的序列了。这样一个简单的按id分表的配置就完成了。

代码

第一步,当然是引jar包了

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

接下来,我们使用mybatis正常插入数据即可,至于数据插入到哪张表里,是由Sharding-JDBC的jar封装好的,对于我们来说是无感知的。