赞
踩
库
表
字段
主要依赖
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>根据实际选择</version> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.2</version> </dependency> <!--使用sharding不能使用druid-spring-boot-starter--> <!-- <dependency>--> <!-- <groupId>com.alibaba</groupId>--> <!-- <artifactId>druid-spring-boot-starter</artifactId>--> <!-- <version>1.2.11</version>--> <!-- </dependency>--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.11</version> </dependency> <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId> <version>4.1.1</version> </dependency>
spring: shardingsphere: # 配置数据源,给数据源起名g1,g2...此处可配置多数据源 datasource: names: g1, g2 g1: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/goods_db username: root password: root g2: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/goods_db2 username: root password: root # 打开sql输出日志 props: sql: show: true
分表:在实际使用中根据策略分配到同数据库的不同的表中
分库:在实际使用中根据策略分配到不同数据库的中
spring: shardingsphere: ### 分库分表 # 配置表的分布 sharding: tables: # 逻辑表名,sql中查询该表时实施策略,select * from g g: # 真实表名,由 数据源名.表名 组成 # g$->{1..2}表示数据源从g1到g2 # goods_$->{1..2}表示数据表从goods_1到goods_2 actual-data-nodes: g$->{1..2}.goods_$->{1..2} key-generator: # 指定goods表主键gid 生成策略为 SNOWFLAKE column: gid type: SNOWFLAKE # 配置表策略 table-strategy: inline: # 指定分表策略 约定gid值是偶数添加到goods_1表,如果gid奇数添加到tgoods_2表 sharding-column: gid algorithm-expression: goods_$->{gid % 2 + 1} # 配置库策略 database-strategy: inline: # 根据user_id分库,根据user_id判断奇偶数选择数据源 sharding-column: user_id algorithm-expression: g$->{user_id % 2 + 1}
使用中除了mapper写法有点区别外,其他类、文件与正常使用一致
Mapper中主要是xml文件里sql写法不同
原 select * from goods_1 where gid = #{gid} and user_id = #{userId}
先需将表名改为g,即 select * from g where gid = #{gid} and user_id = #{userId}
sharding会自动根据gid和user_id的值进行分库分表
如上文所配时:
当user_id为2,偶数,则会选择g1数据源,即goods_db库
当gid为3,奇数,则会选择goods_2表
则最终会使用goods_db库的goods_2表
有两种,一种是全局,另一种是可针对分表配置主从数据库
使用全局主从也许不能使用分库分表,并且sql中表名不能使用分库分表中的写法
即上文中的 select * from g
spring:
shardingsphere:
masterslave:
#主从数据源
name: ds0
# 主数据源
master-data-source-name: g1
# 从数据源
slave-data-source-names: g2
load-balance-algorithm-type: round_robin
针对分表策略配置
spring: shardingsphere: ### 分库分表 sharding: tables: g: # 真实表名,由于是主从策略,因此数据源使用主从数据源,在下文定义 actual-data-nodes: ds0.goods_$->{1..2} key-generator: column: gid type: SNOWFLAKE table-strategy: inline: sharding-column: gid algorithm-expression: goods_$->{gid % 2 + 1} master-slave-rules: # 主从数据源 ds0: # 主数据源 master-data-source-name: g1 # 从数据源 slave-data-source-names: - g2 load-balance-algorithm-type: ROUND_ROBIN # 默认数据源,防止未配置分表的真实表插入时走从表 default-data-source-name: ds0
会自动根据查询还是插入选择不同的数据源
若使用全局,则和正常使用一致
若使用针对分表配置主从,则和分库分表使用一致,可使用分表策略
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。