一.:Sharding 概述(1~10)
1:分库分表的方式:
1)垂直分库:
2)垂直分表:
3)水平分库:(把同一个表的数据,根据规则,放入到不同的数据库)
4)水平分表:(单表数据 1500万 就很大了)
5)总结:
2:分库分表,带来的问题:
1)事务一致性问题:
-1:由于 分库分表,把数据分布在不同数据库,甚至不同服务器。
-2:不可避免会带来 分布式事务 的问题
2)跨节点关联查询:
3)跨节点分页,排序函数:
4)主键避重:
5)公共表问题:(又叫:广播表)
3:Sharding-JDBC 介绍:(当当网开源的)
1)核心:数据分片 + 读写分离。
4:与 JDBC 性能对比:
二.:Shrding-JDBC 快速入门(11~16)(水平分表)
1:需求说明:
2:环境搭建:
1)环境说明:
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://114.215.173.88:3306/order_db
username: root
password: ROOT.root.123
type: com.alibaba.druid.pool.DruidDataSource
mybatis:
mapper-locations: classpath:mybatis/mapper/OrderMapper.xml
configuration:
map-underscore-to-camel-case: true
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.22</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
-- 引入 sharding-jdbc 与 springboot 整合依赖
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.0.0-RC1</version>
</dependency>
2)数据库准备:
create database order_db;
create table t_order_1 (
order_id bigint(20) primary key comment '订单id',
price decimal(10, 2) not null comment '订单价格',
user_id bigint(20) not null comment '下单用户id',
order_status varchar(50) not null comment '订单状态'
);
create table t_order_2 (
order_id bigint(20) primary key comment '订单id',
price decimal(10, 2) not null comment '订单价格',
user_id bigint(20) not null comment '下单用户id',
order_status varchar(50) not null comment '订单状态'
);
3:编写程序:
1)分片规则配置:
-1:分片规则配置:是 Sharding-JDBC 进行对分库分表操作的重要依据。
-2:配置内容包括:数据源、主键生成策略、分片策略等。
-3:配置文件 yml:
#---------- 配置分片规则 ----------开始 #
spring.shardingsphere.datasource.names=db1
# 1:定义数据源
spring.shardingsphere.datasource.db1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.db1.url=jdbc:mysql://114.215.173.88:3306/order_db
spring.shardingsphere.datasource.db1.username=root
spring.shardingsphere.datasource.db1.password=ROOT.root.123
spring.shardingsphere.datasource.db1.type=com.alibaba.druid.pool.DruidDataSource
# 2:指定 t_order 表的 数据分布情况,配置数据节点
spring.shardingsphere.sharding.tables.t_order.actual-data-nodes=db1.t_order_$->{
1..2}
# 3:指定 t_order 表的 主键生成策略为:SNOWFLAKE
spring.shardingsphere.sharding.tables.t_order.key-generator.column=order_id
spring.shardingsphere.sharding.tables.t_order.key-generator.type=SNOWFLAKE
# 4:指定 t_order 表的 分片策略,分片策略包括:分片键 + 分片算法
spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.sharding-column=order_id
spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.algorithm-expression=t_order_$->{
order_id % 2 + 1}
# 5:打印 sql 输出日志,查看执行的真实 sql
spring.shardingsphere.props.sql.show=true
#---------- 配置分片规则 ----------结束 #
spring.main.allow-bean-definition-overriding=true
# mybatis 配置
mybatis.mapper-locations=classpath:mybatis/mapper/OrderMapper.xml
mybatis.configuration.map-underscore-to-camel-case=true
logging.level.com=debug
2)数据操作,测试:
@SpringBootTest
class Springboot02ShardingjdbcHeimaApplicationTests {
@Autowired
private OrderMapper orderMapper;
@Test
void add() {
// 插入订单
OrderEntity orderEntity = new OrderEntity();
orderEntity.setPrice(new BigDecimal(20.5));
orderEntity.setOrderStatus("1");
orderEntity.setUserId(