Sharding-JDBC(版本3.0) 分库分表入门demo-3 springboot+mybatis+druid+分布式主键(可选)+绑定表+默认数据源等

news/2024/9/20 12:52:03

先创建好数据库ds_0,ds_1
并分别在两个数据库中创建表news,order_info_0,order_info_1,order_item_0,order_item_1
其中 news表用于默认数据源配置的测试
order_info和order_item为分库分表和绑定表测试

CREATE TABLE `news` (`title` varchar(50) DEFAULT NULL,`hits` int(11) DEFAULT NULL,`content` text
) ENGINE=InnoDB DEFAULT CHARSET=utf8;CREATE TABLE `order_info_0` (`oid` bigint(20) DEFAULT NULL,`uid` int(11) DEFAULT NULL,`status` varchar(50) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;CREATE TABLE `order_item_0` (`itemId` bigint(20) NOT NULL,`uid` int(11) DEFAULT NULL,`oid` bigint(20) DEFAULT NULL,`status` varchar(50) DEFAULT NULL,PRIMARY KEY (`itemId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

需求:根据uid,数据到ds_0或ds_1数据库,根据oid,数据到order_info_0或order_info_1表

1 新建springboot项目,添加依赖

<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.2</version>
</dependency>
<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.6</version>
</dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.38</version>
</dependency><!-- sharding-jdbc starter -->
<dependency><groupId>io.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><version>3.0.0.M2</version>
</dependency>

 2 编写分库分表的核心配置文件application.properties

# 数据库连接池配置变量
initialSize=5
minIdle=5
maxIdle=100
maxActive=20
maxWait=60000
timeBetweenEvictionRunsMillis=60000
minEvictableIdleTimeMillis=300000# --------------- 配置真实的数据源 ---------------
# 真实数据源配置,这里的ds0,ds1会在下面的配置中引用
sharding.jdbc.datasource.names=ds0,ds1
# 数据库连接1
sharding.jdbc.datasource.ds0.type=com.alibaba.druid.pool.DruidDataSource
sharding.jdbc.datasource.ds0.driver-class-name=com.mysql.jdbc.Driver
# 坑,注意这里是key是url,如果使用默认数据源com.zaxxer.hikari.HikariDataSource,则是jdbc-url
sharding.jdbc.datasource.ds0.url=jdbc:mysql://localhost:3306/ds_0?useSSL=false&serverTimezone=GMT
sharding.jdbc.datasource.ds0.username=root
sharding.jdbc.datasource.ds0.password=123456# 初始连接数
sharding.jdbc.datasource.ds0.initialSize=${initialSize}
# 最小连接数
sharding.jdbc.datasource.ds0.minIdle=${minIdle}
# 最大连接池数量
sharding.jdbc.datasource.ds0.maxActive=${maxActive}
# 配置获取连接等待超时的时间
sharding.jdbc.datasource.ds0.maxWait=${maxWait}
# 用来检测连接是否有效的sql
sharding.jdbc.datasource.ds0.validationQuery=SELECT 1 FROM DUAL
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
sharding.jdbc.datasource.ds0.timeBetweenEvictionRunsMillis=${timeBetweenEvictionRunsMillis}
# 配置一个连接在池中最小生存的时间,单位是毫秒
sharding.jdbc.datasource.ds0.minEvictableIdleTimeMillis=${minEvictableIdleTimeMillis}# 数据库连接2
sharding.jdbc.datasource.ds1.type=com.alibaba.druid.pool.DruidDataSource
sharding.jdbc.datasource.ds1.driver-class-name=com.mysql.jdbc.Driver
sharding.jdbc.datasource.ds1.url=jdbc:mysql://localhost:3306/ds_1?useSSL=false&serverTimezone=GMT
sharding.jdbc.datasource.ds1.username=root
sharding.jdbc.datasource.ds1.password=123456# 初始连接数
sharding.jdbc.datasource.ds1.initialSize=${initialSize}
# 最小连接数
sharding.jdbc.datasource.ds1.minIdle=${minIdle}
# 最大连接池数量
sharding.jdbc.datasource.ds1.maxActive=${maxActive}
# 配置获取连接等待超时的时间
sharding.jdbc.datasource.ds1.maxWait=${maxWait}
# 用来检测连接是否有效的sql
sharding.jdbc.datasource.ds1.validationQuery=SELECT 1 FROM DUAL
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
sharding.jdbc.datasource.ds1.timeBetweenEvictionRunsMillis=${timeBetweenEvictionRunsMillis}
# 配置一个连接在池中最小生存的时间,单位是毫秒
sharding.jdbc.datasource.ds1.minEvictableIdleTimeMillis=${minEvictableIdleTimeMillis}# --------------- 数据库的分片策略 ---------------
# 数据库的分片策略 根据uid,分成ds_0,ds_1两个数据库
# 分库列
sharding.jdbc.config.sharding.default-database-strategy.inline.sharding-column=uid
# 分库算法
sharding.jdbc.config.sharding.default-database-strategy.inline.algorithm-expression=ds$->{uid % 2}# --------------- 表的的分片策略(可配置多个) ---------------
# 配置逻辑表order_info实际节点,这里的ds就是引用上面定义的名称
# 其中 sharding.tables.order_info是逻辑表,ds$->{0..1}.order_info是真实的表
sharding.jdbc.config.sharding.tables.order_info.actual-data-nodes=ds$->{0..1}.order_info_$->{0..1}
# 配置自动生成主键,生成分布式id,防止主键重复
sharding.jdbc.config.sharding.tables.order_info.key-generator-column-name=oid
# 表的分片策略根据 oid,分成order_info_0,order_info_1两个表
# 指定表分片的列,表示我们是使用哪个列进行分片
sharding.jdbc.config.sharding.tables.order_info.table-strategy.inline.sharding-column=oid
# 表分片 算法表达式
# ----------- 这里不能跟分库策略一样,否则会导致有一半数据表没有机会插入数据 -----------
sharding.jdbc.config.sharding.tables.order_info.table-strategy.inline.algorithm-expression=order_info_${(oid % 5) % 2}# 配置生成自增ID的雪花算法,单台服务器可以不配置
spring.shardingsphere.sharding.tables.order_info.key-generator.column=oid
# 使用snowflake算法
spring.shardingsphere.sharding.tables.order_info.key-generator.type=SNOWFLAKE
spring.shardingsphere.sharding.tables.order_info.key-generator.props.worker.id=1
spring.shardingsphere.sharding.tables.order_info.key-generator.props.max.tolerate.time.difference.milliseconds=0# 定义逻辑表order_item的真实数据节点,生成分布式主键id,分表列,分表的规则
sharding.jdbc.config.sharding.tables.order_item.actual-data-nodes=ds$->{0..1}.order_item_$->{0..1}
sharding.jdbc.config.sharding.tables.order_item.key-generator-column-name=itemId
sharding.jdbc.config.sharding.tables.order_item.table-strategy.inline.sharding-column=oid
sharding.jdbc.config.sharding.tables.order_item.table-strategy.inline.algorithm-expression=order_item_${(oid % 5) % 2}# 绑定表,效率高,避免出现笛卡尔
# 有文章说主表和子表的分片规则一样的时候,绑定表生效,测试时两个表可以不一样,也会生效
sharding.jdbc.config.sharding.binding-tables[0]= order_info,order_item# 未配置分片规则的表将通过默认数据源定位
# 有些情况下,我们某些表并不需要进行分表分库,所以需要这样设置
sharding.jdbc.config.sharding.default-data-source-name=ds1# 显示运行的sql
sharding.jdbc.config.sharding.props.sql.show=true

3 剩下的按照正常的流程开发,唯一需要注意的,mapper层所操作的表,都是逻辑表

测试时,可观察到控制台输出的真实sql 

springboot整合mybatis可参考博文 https://blog.csdn.net/qq_41712271/article/details/105095122 


https://dhexx.cn/news/show-18622.html

相关文章

在MVC3中抛出错误页--HttpException

最近在用MVC实现一些权限管理方面的东西&#xff0c;大概思路是继承AuthorizeAttribute写了一个子类UserAuthorizeAttribute&#xff0c;在需要验证的Action或controller中引用该Attribute。重写了三个方法&#xff0c;依执行顺序分别是OnAuthorization -> AuthorizeCore -&…

PBCS项目总结

PBCS项目已经成功地Product&#xff0c;终于可以缓解一下紧张的心情&#xff0c;最近连续四五个月紧张地工作&#xff0c;头都要大了。如今比较清闲&#xff0c;是时候总结一下整个项目了。&#xff08;古人云&#xff1a;成功在于总结嘛&#xff09; 整个项目是二个人开发的&a…

linux 升级tar,升级Linux tar 解决某用tar解压失败的tar包

今天解压个文件,出来很多这样的:/bin/tar: Ignoring unknown extended header keyword SCHILY.dev/bin/tar: Ignoring unknown extended header keyword SCHILY.ino/bin/tar: Ignoring unknown extended header keyword SCHILY.nlink查阅资料,说是需要更新我的tar版本找到官网:…

Question2Answer安装

Question2Answer的安装过程很简单&#xff0c;只需要几分钟的时间你就可以有一个强大的问答系统。 安装要求 Web服务器(比如Apache)PHP 4.3 或更高版本 (最好是PHP 5.x )MySQL 4.1 或更高版本 (或 MySQL 5.x)第一次安装&#xff08;无SSO-单点登陆&#xff09; 下载最新版的Que…

linux工作中常用之必备基础命令-1

1、cd命令 功能说明&#xff1a;切换目录。 举 例&#xff1a;cd /usr/local/&#xff1b;cd .. 2、ls命令 功能说明&#xff1a;列出目录内容。 举 例&#xff1a;ls -ltr &#xff1b;ls -lrt /home/ 3、pwd命令 功能说明&#xff1a;查询所在目录。 举 例&#xff1a; pwd…

paip.日志中文编码原理问题本质解决python

paip.日志中文编码原理问题本质解决python 默认的python日志编码仅仅gbk...保存utf8字符错误..输出到个eric5的控制台十默认好像十unicode的,要是有没显示出来的字符,大概十字体问题..调整eric5的字体走ok兰.#调用封装from log import *iniLog (r"c:\enPn2atiEnPh.log&quo…

linux queue size io,如何在Linux上顯示當前磁盤IO隊列長度?

I am working on a new IO scheduler for the Linux Kernel. I am trying to see if anyone knows of a tool that prints out total number of outstanding IO requests (Disk IO queue) in Linux?我正在為Linux內核開發一個新的IO調度器。我想知道是否有人知道在Linux中打印…

关于SQL的分组汇总统计(关键字 Grouping)

在做数据分组查询的时候我们经常会用到分组汇总查询&#xff0c;做个简单的例子&#xff1a; create table #bbb (大类 nvarchar(10),小类 nvarchar(10),酒水名称 nvarchar(20),数量 int,单价 Money) ----------------------------------------------------- insert into #bbb…

nyoj 547 优先队列

#include<stdio.h>#include<string.h>#include<queue>//水杯盛水问题&#xff0c;用优先队列不断从最小的边缘开始using namespace std;int n,m;#define N 400int p[N][N];struct node {int x,y,w;friend bool operator<(node a,node b) {//优先队列retur…

linux工作中常用之必备基础命令-2

1、clear命令 功能说明&#xff1a;清屏。 举 例&#xff1a;clear ; ctrl l 2、who命令 功能说明&#xff1a;当前在本地系统上的所有用户的信息 举 例&#xff1a;whoami ; who 3、uptime命令 功能说明&#xff1a;查询系统信息 举 例&#xff1a; load average: 0.00, 0.…