小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
前言
分库分表大家在项目中肯定都用过,也有不少的开源中间件,当然一些大一点的公司基于一些开源的组件做一些封装比如myCat, shardingJDBC 等等,对于小公司来说这些开源的基础组件其实非常好用了,也是一个项目基建必备的产品。这里主要介绍一下ShardingJDBC。
ShardingJDBC
定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务。 它使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架。
官方网站
shardingsphere.apache.org/index_zh.ht…
核心架构(ShardingJDBC)
SpringBoot 整合MyBatisPlus和ShardingJDBC
1. 安装依赖
创建一个SpringBoot工程项目,主要添加下面的一些依赖。
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-starter-test
test
com.baomidou
mybatis-plus-boot-starter
3.0.5
mysql
mysql-connector-java
org.apache.shardingsphere
sharding-jdbc-spring-boot-starter
4.1.1
com.alibaba
druid
1.1.22
com.sun
tools
com.sun
jconsole
```
```
2. 分表策略配置
分表策略配置一般直接放在本地,不建议nacos配置
SQL脚本
CREATE TABLE `smp_down_link_record` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`merchant_id` int(10) not NULL COMMENT '商户ID',
`mass_task_id` int(10) not NULL COMMENT '任务ID',
`mass_task_name` varchar(128) not NULL '任务名称',
`phone` varchar(128) not NULL '手机号码',
`STATUS` TINYINT not NULL COMMENT '0. 待发送 1. 发送成功 2. 未知 3. 发送失败',
`error_code` varchar(32) COMMENT '错误码',
`create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
分表策略配置
spring.main.allow-bean-definition-overriding=true
#配置数据源的详细信息,多个逗号分开
sharding.jdbc.datasource.names=m1
# 数据库连接池
sharding.jdbc.datasource.m1.type=com.alibaba.druid.pool.DruidDataSource
#数据库驱动类名
sharding.jdbc.datasource.m1.driver-class-name=com.mysql.cj.jdbc.Driver
# 数据库 URL 连接
sharding.jdbc.datasource.m1.url=jdbc:mysql://127.0.0.1:3306/smp?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC
# 数据库用户名
sharding.jdbc.datasource.m1.username=root
# 数据库密码
sharding.jdbc.datasource.m1.password=****
# 指定smp_down_link_record 表的分布情况
sharding.jdbc.config.sharding.tables.smp_down_link_record.actual-data-nodes=m1.smp_down_link_record_$->{0..1}
#指定smp_down_link_record表中主键的生成策略 SNOWFLAKE:雪花算法,随机生成主键Id
#sharding.jdbc.config.sharding.tables.smp_down_link_record.key-generator-column-name=id
#sharding.jdbc.config.sharding.tables.smp_down_link_record.key-generator-type=SIMPLE
# 指定分片的策略 约定id值:
sharding.jdbc.config.sharding.tables.smp_down_link_record.table-strategy.inline.sharding-column=merchant_id
sharding.jdbc.config.sharding.tables.smp_down_link_record.table-strategy.inline.algorithm-expression=smp_down_link_record_$->{merchant_id%2}
#打开sql的输出日志
sharding.jdbc.config.sharding.props.sql.show=true
#实体类扫描配置,这样在mapper的xml中可以直接使用实体类名,不用写包路径
mybatis.type-aliases-package=com.sharding.jdbc.demo.entity
#驼峰转换
mybatis.configuration.mapUnderscoreToCamelCase=true
#处理日期
spring.jackson.date-format=yyyy-MM-dd HH:mm
spring.jackson.time-zone=GMT+8
工程代码比较简单没有复杂sql,直接集成mysqlplus的ORM框架。
测试方法
@SpringBootTest
class ShardingJdbcDemoApplicationTests {
@Resource
private DownLinkRecordDAO downLinkRecordDAO;
@Test
void contextLoads() {
DownLinkRecord downLinkRecord = new DownLinkRecord();
downLinkRecord.setMassTaskId(1);
downLinkRecord.setMerchantId(5);
downLinkRecord.setMassTaskName("测试任务");
downLinkRecord.setPhone("askdaodasdaskdfsdfodsuo");
downLinkRecord.setErrorCode("");
downLinkRecord.setStatus(1);
downLinkRecordDAO.save(downLinkRecord);
}
}
FAQ
关于分表配置还是建议用properties的形式,ymal容易出现格式错误,导致报错,这个错误还容易误导我们。