第一步.引入依赖
<dependency>
<groupId></groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId></groupId>
<artifactId>sharding-jdbc-spring-namespace</artifactId>
<version>4.0.1</version>
</dependency>
<!-- 使用原生druid池-->
<dependency>
<groupId></groupId>
<artifactId>druid</artifactId>
<version>1.1.16</version>
</dependency>
<dependency>
<groupId></groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId></groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
第二步.配置
spring:
main:
allow-bean-definition-overriding: true
shardingsphere:
props:
sql:
show: true # 开启sql日志输出
datasource: # 配置数据源
names: demo0,demo1 # 分库的逻辑库名,可配置多个
demo0: # 逻辑库名
type:
driver-class-name:
url: jdbc:mysql://127.0.0.1:3306/demo0?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=false&useSSL=false&serverTimezone=GMT
username: user
password: password
demo1: # 逻辑库名
type:
driver-class-name:
url: jdbc:mysql://127.0.0.1:3306/demo1?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=false&useSSL=false&serverTimezone=GMT
username: user
password: password
sharding:
tables: # 逻辑表名
user: # 逻辑表名
actual-data-nodes: demo$->{0..1}.user$->{0..1}
table-strategy: # 分表策略
inline:
sharding-column: id # 分片路由标准
algorithm-expression: user$->{id % 2} # 分片算法表达式
key-generator:
column: id
type: SNOWFLAKE
order: # 逻辑表名
actual-data-nodes: demo$->{0..1}.order$->{0..1}
table-strategy: # 分表策略
inline:
sharding-column: id # 分片路由标准
algorithm-expression: order$->{id % 2} # 分片算法表达式
key-generator:
column: id
type: SNOWFLAKE
binding-tables: user
default-database-strategy: # 分库策略
inline:
sharding-column: id # 分片路由标准
algorithm-expression: demo${id % 2} # 分库策略表达式 * 注:此处配置demo${id % 2}而不是demo->${id % 2},因为(Collection<String> availableTargetNames, Collection<RouteValue> shardingValues)函数会解析策略表达式shardingValues为直接替换$变量进而匹配逻辑库名availableTargetNames
三.问题解决方案
1.数据库连接加载失败
使用原始数据库连接池
2.加载数据库连接池报无法加载,已存在bean:
启动类加入@EnableAutoConfiguration(exclude={})排除自动装载默认配置
3.整合shardingsphere后报algoric expression is required
检查配置是否写错,可能是策略表达式配置问题导致
database 问题
shardingsphere通过策略表达式无法匹配解析对应的逻辑数据库,则说明配置有问题,我遇到了一个-expression=demo$->id % 2}的问题
一开始参照官网,如上配置,但这是shardingsphere原生core包的配置,springboot-starter包我查看了源码:
public Collection<String> doSharding(Collection<String> availableTargetNames, Collection<RouteValue> shardingValues) {
RouteValue shardingValue = (RouteValue)().next();
(shardingValue instanceof ListRouteValue, "Inline strategy cannot support range sharding.");
Collection<String> shardingResult = ((ListRouteValue)shardingValue);
Collection<String> result = new TreeSet(String.CASE_INSENSITIVE_ORDER);
Iterator var6 = ();
while(()) {
String each = (String)();
if ((each)) {
(each);
}
}
return result;
}
// 此方法做分片路由策略
//availableTargetNames 表示逻辑表集合,shardingValues表示路由策略表达式解析后的策略集合
//只有当shardingValues的值在availableTargetNames中时,说明路由匹配成功,所以要完全匹配上才行
public Collection<String> doSharding(Collection<String> availableTargetNames, Collection<RouteValue> shardingValues) {
RouteValue shardingValue = (RouteValue)().next();
(shardingValue instanceof ListRouteValue, "Inline strategy cannot support range sharding.");
Collection<String> shardingResult = ((ListRouteValue)shardingValue);
Collection<String> result = new TreeSet(String.CASE_INSENSITIVE_ORDER);
Iterator var6 = ();
while(()) {
String each = (String)();
if ((each)) {
(each);
}
}
return result;
}
最后修改demo->${id % 2}为demo${id % 2},最后问题解决