一、yml配置
# 数据源配置
spring:
shardingsphere:
#声明数据源
datasource:
names: m1,s1
m1:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.69.112:33106/mall?serverTimezone=GMT%2B8
username: root
password: 123456
s1:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.69.112:33206/mall?serverTimezone=GMT%2B8
username: root
password: 123456
#水平分表规则
sharding:
tables:
#course表的规则 ds0代表读写分离的数据源 1..10代表水平切分10个course表
course:
actual-data-nodes: ds0.course_$->{1..10}
key-generator:
#id生成规则-雪花算法
column: cid
type: SNOWFLAKE
table-strategy:
inline:
#根据主键cid的雪花算法生成的id号 模于10 再+1 得到的表名 决定插入哪个表
sharding-column: cid
algorithm-expression: course_$->{cid % 10 + 1}
touch:
actual-data-nodes: ds0.touch_$->{1..2}
key-generator:
column: tid
type: SNOWFLAKE
table-strategy:
inline:
sharding-column: tid
algorithm-expression: touch_$->{tid % 2 + 1}
#读写分离
master-slave-rules:
ds0:
master-data-source-name: m1
slave-data-source-names: s1
#显示sql日志
props:
sql:
show: true
#一个实体类对应多个表的配置
main:
allow-bean-definition-overriding: true
总结遇到的问题
1、管理类的模块(如广告管理 修改广告的状态 页面点击查询才可以看到修改后的状态)
解决方案:强制查询主库
/**
* 列表
*/
@ApiOperation("查询收费标准表列表")
@PreAuthorize("@ss.hasPermi('charge:model:list')")
@GetMapping("/list")
public R<PageDataInfo<ChargeModelVo>> list(ChargeModelDto chargeModelDto) {
startPage();
//强制读主库查询
HintManager instance = HintManager.getInstance();---
if(!HintManager.isMasterRouteOnly()){---
instance.setMasterRouteOnly();---
}---
List<ChargeModelVo> list = chargeModelService.selectChargeModelList(chargeModelDto);
instance.close();---
return R.success(getPageDataTable(list));
}