赞
踩
ShardingSphere基础知识、ShardingSphere-JDBC如何集成进若依框架中
使用的是若依框架(SpringBoot)前后端版本、动态数据源,可自行切换,默认数据源为达梦8
官网文档地址:https://shardingsphere.apache.org/document/current/cn/overview/
项目框架:若依前后端分离版本(SpringBoot 2.7.10)
ORM:Mybatis Plus(mybatis-plus-boot-starter 3.5.3)
数据库连接池:druid(druid-spring-boot-starter 1.2.15)
组件:ShardingSphere-JDBC(shardingsphere-jdbc-core-spring-boot-starter 5.2.0)
总pom引入shardingsphere-jdbc-core-spring-boot-starter
<!-- 分库分表引擎 -->
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
<version>5.2.0</version>
</dependency>
framework模块引入shardingsphere-jdbc-core-spring-boot-starter
admin模块新增配置文件application-shardingsphere.yml
# 数据源配置
spring:
shardingsphere:
# 单机模式
mode:
type: Standalone
props:
sql-show: true
# 数据源配置
datasource:
names: druid,sharding
# 主库数据源
master:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: dm.jdbc.driver.DmDriver
url: jdbc:dm://localhost:5236?SCHEMA=xx&zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&rewriteBatchedStatements=true
username: SYSDBA
password: SYSDBA
# 分库数据源
sharding:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: dm.jdbc.driver.DmDriver
url: jdbc:dm://localhost:5236?SCHEMA=xx
username: SYSDBA
password: SYSDBA
# driver-class-name: com.mysql.jdbc.Driver
# url: jdbc:mysql://localhost:3306/ry-order1?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
# username: root
# password: root
# 标准分片配置
rules:
# 分片规则
sharding:
tables:
# 表名
tb_user:
actual-data-nodes: sharding.tb_user_${0..1} # 相当于tb_user_0、tb_user_1
table-strategy: # 分表策略
standard: # 标准分表策略
sharding-column: id # 分表列名
sharding-algorithm-name: tb_user_inline # 分表算法名字
# 分片算法
shardingAlgorithms:
tb_user_inline:
# 策略类型
type: INLINE
props:
algorithm-expression: tb_user_$->{id % 2} # 结果为0和1,与上面的表名对应
相应修改DruidProperties.java里的配置值
结果:没有数据分片的效果
在方案一的基础上
DataSourceType加上类型SHARDING
DruidConfig加上数据源
setDataSource(targetDataSources, DataSourceType.SHARDING.name(), "shardingSphereDataSource");
调用方法上增加数据源类型
@Override
@DataSource(DataSourceType.SHARDING)
public Long insertNew(User user) {
return (long) userMapper.insert(user);
}
注意点:shardingSphereDataSource默认使用的数据源名称就是sharding
结果:可以进行数据分片
总pom引入shardingsphere-jdbc-core-spring-boot-starter
<!-- 分库分表引擎 -->
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
<version>5.2.0</version>
</dependency>
framework模块引入shardingsphere-jdbc-core-spring-boot-starter
admin模块配置文件新增配置项指定sharding配置
spring:
shardingsphere:
configLocation: application-sharding.yml
新增sharding配置文件application-sharding.yml,注意部分单词驼峰
# 数据源
dataSources:
sharding:
dataSourceClassName: com.alibaba.druid.pool.DruidDataSource
driverClassName: dm.jdbc.driver.DmDriver
url: jdbc:dm://localhost:5236?SCHEMA=xx
username: SYSDBA
password: SYSDBA
maxTotal: 100
# ds_1:
# dataSourceClassName: com.alibaba.druid.pool.DruidDataSource
# driverClassName: com.mysql.cj.jdbc.Driver
# url: jdbc:mysql://localhost:3306/ry-order2?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
# username: root
# password: root
# maxTotal: 100
rules:
- !TRANSACTION
defaultType: LOCAL
- !SHARDING
tables:
# 表名
tb_user:
actualDataNodes: sharding.tb_user_$->{0..1}
tableStrategy: # 分表策略
standard: # 标准分表策略
sharding-column: id # 分表列名
sharding-algorithm-name: tb_user_inline # 分表算法名字
# 分片算法
shardingAlgorithms:
tb_user_inline:
# 策略类型
type: INLINE
props:
algorithm-expression: tb_user_$->{id % 2}
# 分布式序列算法配置(主键生成)
keyGenerators:
# 雪花算法
snowflake:
type: SNOWFLAKE
props:
# 输出SQL
sql-show: true
新增sharding配置类:ShardingProperties.java
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ShardingProperties {
@Value("${spring.shardingsphere.configLocation}")
private String configLocation;
public String getConfigLocation() {
return configLocation;
}
}
DataSourceType加上类型SHARDING
DruidConfig加上数据源
@Bean
public DataSource shardingDataSource(ShardingProperties shardingProperties) throws Exception
{
ClassPathResource classPathResource = new ClassPathResource(shardingProperties.getConfigLocation());
InputStream inputStream = classPathResource.getInputStream();
File tmpFile = File.createTempFile(shardingProperties.getConfigLocation(), ".tmp");
Files.copy(inputStream, tmpFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
DataSource dataSource = YamlShardingSphereDataSourceFactory.createDataSource(tmpFile);
return dataSource;
}
// 动态数据源方法加上sharding
@Bean(name = "dynamicDataSource")
@Primary
public DynamicDataSource dataSource(DataSource masterDataSource) {
Map<Object, Object> targetDataSources = new HashMap<>();
targetDataSources.put(DataSourceType.MASTER.name(), masterDataSource);
setDataSource(targetDataSources, DataSourceType.SHARDING.name(), "shardingDataSource");
return new DynamicDataSource(masterDataSource, targetDataSources);
}
调用方法上增加数据源类型
结果:可以进行数据分片
ShardingSphere各个版本有差异,并且不一定完全向前兼容,与其他框架如Springboot、druid上可能也存在某些版本无法兼容,所以需要注意引入的各个框架的版本
只有使用分片键进行操作才会通过分表扫描,否则依然是全表扫描
不支持分片表和单表关联查询
分页:如果是一些非主流的数据库,不在支持的数据库类型里,则需要适配
解决方案一:使用支持的数据库方言类型,如MySQL
解决方案二:通过自定义分页SQL实现
SELECT *
FROM ( SELECT TMP.*,
ROWNUM ROW_ID
FROM ( SELECT id,
company_code,
FROM table_name ) TMP
WHERE ROWNUM <=?)
WHERE ROW_ID > ?
无法更新:IService.updateById()
@TableField(updateStrategy = FieldStrategy.NEVER)
表约束失效:唯一性约束在多个表失效
使用in条件,即使使用分片键,还是会走全路由
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。