ShardingSphere-JDBC-Core-Spring-Boot-Starter 和 ShardingSphere-JDBC 是两个不同但又相关的项目,它们的主要区别如下:
概念与定位
ShardingSphere-JDBC:是 ShardingSphere 项目中的一个重要模块,它是一个轻量级的 Java 框架,主要功能是为了实现数据库的分库分表、读写分离等操作,它可以在 Java 应用中像使用普通 JDBC 驱动一样使用,对应用程序的侵入性较小。
ShardingSphere-JDBC-Core-Spring-Boot-Starter:是基于 Spring Boot 的启动器(Starter),它的作用是简化 ShardingSphere-JDBC 在 Spring Boot 项目中的集成和配置。它将 ShardingSphere-JDBC 与 Spring Boot 的自动配置机制相结合,使得开发者可以更方便地在 Spring Boot 环境中使用 ShardingSphere-JDBC 的功能。
功能特性
ShardingSphere-JDBC:提供了全面的数据库分片和读写分离功能。它支持多种分片策略,包括按照哈希值、范围、列表等方式进行分片,能够根据业务需求灵活地将数据分散到多个数据库或表中。同时,它也支持动态数据源切换,方便实现读写分离,提高系统的性能和可用性。
ShardingSphere-JDBC-Core-Spring-Boot-Starter:主要特性在于其与 Spring Boot 的深度集成。它通过自动配置功能,减少了在 Spring Boot 项目中配置 ShardingSphere-JDBC 的繁琐步骤。开发者只需在项目的配置文件中进行简单的配置,就可以快速启用 ShardingSphere-JDBC 的功能。
使用场景
ShardingSphere-JDBC:适用于各种 Java 项目,无论是传统的 Java Web 应用,还是基于微服务架构的分布式系统,只要需要对数据库进行分库分表或读写分离操作,都可以使用 ShardingSphere-JDBC。
ShardingSphere-JDBC-Core-Spring-Boot-Starter:主要适用于使用 Spring Boot 框架构建的项目。如果项目已经基于 Spring Boot 开发,并且需要使用 ShardingSphere-JDBC 来实现数据库的相关功能,那么使用 ShardingSphere-JDBC-Core-Spring-Boot-Starter 可以大大简化集成过程,提高开发效率。
依赖关系与配置
ShardingSphere-JDBC:在使用时,需要在项目中引入相应的依赖坐标。配置方面,需要手动创建数据源、配置分片规则等,相对来说配置过程较为复杂,需要开发者对 ShardingSphere-JDBC 的配置参数有一定的了解。
ShardingSphere-JDBC-Core-Spring-Boot-Starter:在依赖方面,除了引入 ShardingSphere-JDBC 的相关依赖外,还需要引入 Spring Boot 的相关依赖。在配置上,它借助 Spring Boot 的配置机制,通过在application.properties或application.yml文件中配置相关属性,就可以完成 ShardingSphere-JDBC 的大部分配置工作,配置相对简单直观。
直接上干货
目前开发环境为Springcloud ,springBoot配置文件是一致的 yml文件
这里我是由若依的多数据源分片算法改动而来
推荐0基础的先去跟着若依提供的跟着去配置一遍,比较容易理解我这块自定义的
原文多数据源集成分库分表
# spring配置
spring:redis:host: 127.0.0.1port: 6379db: 3timeout: 2000#分库分表的自定义配置shardingsphere:datasource:ds0:driver-class-name: com.mysql.cj.jdbc.Drivertype: com.zaxxer.hikari.HikariDataSourceusername: rootpassword: rootjdbc-url: jdbc:mysql://11.11.11.11:3306/ry-log?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8names: ds0props:sql-show: truerules:sharding:binding-tables: sys_oper_log# 分布式序列算法配置 这里只是配置雪花算法key-generators:snowflake:type: SNOWFLAKEprops:worker-id: 123sharding-algorithms:table-classbased:props:strategy: standard# 自定义标准分配算法algorithmClassName: com.ruoyi.system.config.MyTableHintShardingAlgorithmtype: CLASS_BASEDtables:sys_oper_log:##我这里是单库分表actual-data-nodes: ds0.sys_oper_log_GET,ds0.sys_oper_log_PUT# biu在这里配置好主键id 雪花算法才会启用 当然表主键需要设置为not null 不自动增长key-generate-strategy:column: oper_idkey-generator-name: snowflaketable-strategy:standard:sharding-algorithm-name: table-classbased ##上面设置的自定义分片方法sharding-column: request_method ## 分片字段##正常的数据库资源池 datasource:druid:stat-view-servlet:enabled: trueloginUsername: adminloginPassword: 123456dynamic:druid:initial-size: 5min-idle: 5maxActive: 20maxWait: 60000connectTimeout: 30000socketTimeout: 60000timeBetweenEvictionRunsMillis: 60000minEvictableIdleTimeMillis: 300000validationQuery: SELECT 1 FROM DUALtestWhileIdle: truetestOnBorrow: falsetestOnReturn: falsepoolPreparedStatements: truemaxPoolPreparedStatementPerConnectionSize: 20filters: stat,slf4jconnectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000datasource:# 主库数据源master:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://11.11.11.11:3306/agrocloud_ecology_cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8username: rootpassword: root# 从库数据源order:username: rootpassword: rooturl: jdbc:mysql://11.11.11.11:3306/ry-order?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8driver-class-name: com.mysql.cj.jdbc.Driver
# mybatis配置
mybatis:# 搜索指定包别名typeAliasesPackage: com.ruoyi.system# 配置mapper的扫描,找到所有的mapper.xml映射文件mapperLocations: classpath:mapper/**/*.xml# swagger配置
swagger:title: 系统模块接口文档license: Powered By ruoyilicenseUrl: https://ruoyi.vip
maven配置
若依框架的要把 ruoyi-common-datasource 注释掉!!!
<dependency><groupId>org.yaml</groupId><artifactId>snakeyaml</artifactId><version>1.33</version></dependency><!-- ShardingSphere 读写分离/分库分表 --><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId><version>5.1.2</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.23</version></dependency><!-- dynamic多数据源 --><dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.4.0</version></dependency>
配置多数据源,使分库分表与德鲁连接池接共存
import java.util.Map;
import javax.annotation.Resource;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Primary;
import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
import com.baomidou.dynamic.datasource.provider.AbstractDataSourceProvider;
import com.baomidou.dynamic.datasource.provider.DynamicDataSourceProvider;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties;/*** 动态数据源配置** @author ruoyi*/
@Configuration
@Lazy
public class DataSourceConfiguration
{/*** 分表数据源名称*/private static final String SHARDING_DATA_SOURCE_NAME = "sharding";/*** 动态数据源配置项*/@Autowiredprivate DynamicDataSourceProperties properties;/*** shardingjdbc有四种数据源,需要根据业务注入不同的数据源** <p>1. 未使用分片, 脱敏的名称(默认): shardingDataSource;* <p>2. 主从数据源: masterSlaveDataSource;* <p>3. 脱敏数据源:encryptDataSource;* <p>4. 影子数据源:shadowDataSource**/@Resourceprivate DataSource shardingSphereDataSource;@Beanpublic DynamicDataSourceProvider dynamicDataSourceProvider(){Map<String, DataSourceProperty> datasourceMap = properties.getDatasource();return new AbstractDataSourceProvider(){@Overridepublic Map<String, DataSource> loadDataSources(){Map<String, DataSource> dataSourceMap = createDataSourceMap(datasourceMap);// 将 shardingjdbc 管理的数据源也交给动态数据源管理dataSourceMap.put(SHARDING_DATA_SOURCE_NAME, shardingSphereDataSource);return dataSourceMap;}};}/*** 将动态数据源设置为首选的* 当spring存在多个数据源时, 自动注入的是首选的对象* 设置为主要的数据源之后,就可以支持shardingjdbc原生的配置方式了*/@Primary@Beanpublic DataSource dataSource(){DynamicRoutingDataSource dataSource = new DynamicRoutingDataSource();dataSource.setPrimary(properties.getPrimary());dataSource.setStrict(properties.getStrict());dataSource.setStrategy(properties.getStrategy());dataSource.setP6spy(properties.getP6spy());dataSource.setSeata(properties.getSeata());return dataSource;}
}
自定义分库分表实现类
import org.apache.shardingsphere.sharding.api.sharding.standard.PreciseShardingValue;
import org.apache.shardingsphere.sharding.api.sharding.standard.RangeShardingValue;
import org.apache.shardingsphere.sharding.api.sharding.standard.StandardShardingAlgorithm;import java.util.Collection;
import java.util.Properties;public class MyTableHintShardingAlgorithm implements StandardShardingAlgorithm<String> {private Properties props = new Properties();@Overridepublic String doSharding(Collection<String> tableNames, PreciseShardingValue<String> shardingValue) {for (String tableName : tableNames) {System.out.println("表名称========================"+tableName);System.out.println("列值名称========================"+shardingValue.getValue());/*** 取模算法,分片健 % 表数量*/String value = shardingValue.getValue().substring(0,2);if (tableName.contains(value)) {return tableName;}}throw new IllegalArgumentException();}@Overridepublic Collection<String> doSharding(Collection<String> collection, RangeShardingValue<String> rangeShardingValue) {return collection;}@Overridepublic Properties getProps() {return this.props;}@Overridepublic void init(Properties properties) {}
}
使用的时候加上注解@DS(“sharding”)即可 实体类无特殊配置,想使用雪花自增id 必须取消掉mysql的自增id