这是我参与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封装好的,对于我们来说是无感知的。