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

news/2023/9/27 7:15:26

先创建好数据库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 -&…

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

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

NSDate

1 //2 // main.m3 // NSDate4 //5 // Created by dingxiaowei on 13-5-17.6 // Copyright (c) 2013年 dingxiaowei. All rights reserved.7 //8 9 #import <Foundation/Foundation.h> 10 11 #pragma mark - 日期创建 12 void dateCreate(){ 13 //NSData表示字节…

Linux查看协议栈缓冲区使用,Linux网络协议栈之套接字缓冲区

链表管理在对skb链表的操作中&#xff0c;为了防止被其他异步操作打断&#xff0c;在操作前都必须现获取SKB头节点中(sk_buff_head结构)的自旋锁&#xff0c;然后才能访问队列中的元素。该链表头结构如下&#xff1a;struct sk_buff_head {/* These two members must be first.…

linux 输入输出错误重定向

什么是输入重定向&#xff1f; 通俗的讲&#xff0c;输入重定向就是把要输入的信息写入到指定的文件中去什么是输出重定向&#xff1f; 通俗的讲&#xff0c;输出重定向就是把要输出的信息写入到一个文件中去&#xff0c;而不是将要输出的文件信息输出到控制台&#xff08;显示…

ArcGIS Runtime for Android开发教程V2.0(3)基础篇---Hello World Map

目录 创建项目项目结构编码实现通过上面章节&#xff0c;我们已经了解如何配置一个ArcGIS Runtime for Android开发环境&#xff0c;下面我们将介绍如何使用Eclipse创建一个ArcGIS移动项目Hello World Map&#xff0c;并且分析项目的相关结构。 1、 创建项目 打开我们已经配置…

linux系统常见的目录和作用

/&#xff1a;根目录&#xff0c;一般根目录下只存放目录&#xff0c;不要存放文件&#xff0c;也不要修改&#xff0c;或者删除目录下的内容 /mnt&#xff1a;测试目录 /root&#xff1a;root用户的家目录 /home&#xff1a;普通用户的家目录 /tmp&#xff1a;临时目录(比如文…

SQL Server 备份和还原全攻略

SQL Server 备份和还原全攻略 原文:SQL Server 备份和还原全攻略一、知识点 完全备份&#xff1a; 备份全部选中的文件夹&#xff0c;并不依赖文件的存档属性来确定备份那些文件。&#xff08;在备份过程中&#xff0c;任何现有的标记都被清除&#xff0c;每个文件都被标记为已…

布局文件Android ListView入门知识--各种Adapter配合使用

PS:今天上午&#xff0c;非常郁闷&#xff0c;有很多简略基础的问题搞得我有些迷茫&#xff0c;哎&#xff0c;代码几天不写就忘。目前又不当COO&#xff0c;还是得用心记代码哦&#xff01; 在Android开发中ListView是比较经常使用的组件&#xff0c;它以列表的情势展示详细内…

dom4j解析xml字符串实例[转]

DOM4J 与利用DOM、SAX、JAXP机制来解析xml相比&#xff0c;DOM4J 表现更优秀&#xff0c;具有性能优异、功能强大和极端易用使用的特点&#xff0c;只要懂得DOM基本概念&#xff0c;就可以通过dom4j的api文档来解析xml。dom4j是一套开源的api。实际项目中&#xff0c;往往选择d…