> 文档中心 > sharding-jdbc5系列教程(一)springboot配置shardingjdbc+mybatis-plus+druid+dynamic-datasource

sharding-jdbc5系列教程(一)springboot配置shardingjdbc+mybatis-plus+druid+dynamic-datasource


系列文章目录

文章目录

  • 系列文章目录
  • 前言
  • 一、shardingjdbc
    • Apache ShardingSphere 是一套开源的分布式数据库解决方案组成的生态圈,它由 JDBC、Proxy 和 Sidecar(规划中)这 3 款既能够独立部署,又支持混合部署配合使用的产品组成。 它们均提供标准化的数据水平扩展、分布式事务和分布式治理等功能,可适用于如 Java 同构、异构语言、云原生等各种多样化的应用场景。
    • Apache ShardingSphere 旨在充分合理地在分布式的场景下利用关系型数据库的计算和存储能力,而并非实现一个全新的关系型数据库。 关系型数据库当今依然占有巨大市场份额,是企业核心系统的基石,未来也难于撼动,我们更加注重在原有基础上提供增量,而非颠覆。
    • Apache ShardingSphere 5.x 版本开始致力于可插拔架构,项目的功能组件能够灵活的以可插拔的方式进行扩展。 目前,数据分片、读写分离、数据加密、影子库压测等功能,以及 MySQL、PostgreSQL、SQLServer、Oracle 等 SQL 与协议的支持,均通过插件的方式织入项目。 开发者能够像使用积木一样定制属于自己的独特系统。Apache ShardingSphere 目前已提供数十个 SPI 作为系统的扩展点,仍在不断增加中。
  • 相关概念这里不过多介绍,建议去官网看[shardingjdbc官网](https://shardingsphere.apache.org/)
  • (一)springboot配置shardingjdbc+mybatis-plus+druid+dynamic-datasource,网上关于5.0教程有点少,与之前版本可能有不同,这里讲的是5.0+版本以上的
  • 二、本教程基于shardingjdbc5.0+版本以上
    • 1.引入库
    • 2.配置mybatis-plus
      • 具体配置依据需求更改,相关sharding-jdbc分片算法本片后续教程会讲解,这里之讲配置整合
    • 3.配置datasource
    • 4.配置完成,启动项目
      • 使用方式很简单,在要使用shardingjdbc数据源的地方加上@DS("sharding")就行了
  • 总结
      • 这样几个框架就整合完毕了


前言

shardingjdbc系列教程


一、shardingjdbc

Apache ShardingSphere 是一套开源的分布式数据库解决方案组成的生态圈,它由 JDBC、Proxy 和 Sidecar(规划中)这 3 款既能够独立部署,又支持混合部署配合使用的产品组成。 它们均提供标准化的数据水平扩展、分布式事务和分布式治理等功能,可适用于如 Java 同构、异构语言、云原生等各种多样化的应用场景。

Apache ShardingSphere 旨在充分合理地在分布式的场景下利用关系型数据库的计算和存储能力,而并非实现一个全新的关系型数据库。 关系型数据库当今依然占有巨大市场份额,是企业核心系统的基石,未来也难于撼动,我们更加注重在原有基础上提供增量,而非颠覆。

Apache ShardingSphere 5.x 版本开始致力于可插拔架构,项目的功能组件能够灵活的以可插拔的方式进行扩展。 目前,数据分片、读写分离、数据加密、影子库压测等功能,以及 MySQL、PostgreSQL、SQLServer、Oracle 等 SQL 与协议的支持,均通过插件的方式织入项目。 开发者能够像使用积木一样定制属于自己的独特系统。Apache ShardingSphere 目前已提供数十个 SPI 作为系统的扩展点,仍在不断增加中。

相关概念这里不过多介绍,建议去官网看shardingjdbc官网

(一)springboot配置shardingjdbc+mybatis-plus+druid+dynamic-datasource,网上关于5.0教程有点少,与之前版本可能有不同,这里讲的是5.0+版本以上的

二、本教程基于shardingjdbc5.0+版本以上

1.引入库

代码如下(示例):

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version></dependency><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId><version>5.0.0</version></dependency><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core-spring-namespace</artifactId><version>5.0.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.8</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.5.0</version></dependency>

2.配置mybatis-plus

server:  port: 11000spring:  autoconfigure:    exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure  main:    allow-bean-definition-overriding: true   datasource:    druid: #druid管理页面配置      stat-view-servlet: enabled: true loginUsername: admin loginPassword: 123456    dynamic: #动态数据源配置      druid: filters: stat,wall,log4j2 # 初始连接数 initialSize: 5 # 最小连接池数量 minIdle: 10 # 最大连接池数量 maxActive: 20 # 配置获取连接等待超时的时间 maxWait: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 timeBetweenEvictionRunsMillis: 60000 # 配置一个连接在池中最小生存的时间,单位是毫秒 minEvictableIdleTimeMillis: 300000 # 配置一个连接在池中最大生存的时间,单位是毫秒 maxEvictableIdleTimeMillis: 900000 # 配置检测连接是否有效 validationQuery: SELECT 1 FROM DUAL testWhileIdle: true testOnBorrow: false testOnReturn: false webStatFilter:   enabled: true filter:   stat:     enabled: true     # 慢SQL记录     log-slow-sql: true     slow-sql-millis: 1000     merge-sql: true   wall:     config:multi-statement-allow: true      datasource: master:   username: root   password: root   url: jdbc:mysql://127.0.0.1:3306/database?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8   driver-class-name: com.mysql.cj.jdbc.Driver  shardingsphere:    datasource:      names: db0      db0: driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource url: jdbc:mysql://127.0.0.1:3306/database?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root password: root filters: stat,wall,log4j2 # 初始连接数 initialSize: 5 # 最小连接池数量 minIdle: 10 # 最大连接池数量 maxActive: 20 # 配置获取连接等待超时的时间 maxWait: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 timeBetweenEvictionRunsMillis: 60000 # 配置一个连接在池中最小生存的时间,单位是毫秒 minEvictableIdleTimeMillis: 300000 # 配置一个连接在池中最大生存的时间,单位是毫秒 maxEvictableIdleTimeMillis: 900000 # 配置检测连接是否有效 validationQuery: SELECT 1 FROM DUAL testWhileIdle: true testOnBorrow: false testOnReturn: false webStatFilter:   enabled: true filter:   stat:     enabled: true     # 慢SQL记录     log-slow-sql: true     slow-sql-millis: 1000     merge-sql: true   wall:     config:multi-statement-allow: true#      db1:# driver-class-name: com.mysql.cj.jdbc.Driver# type: com.alibaba.druid.pool.DruidDataSource# url: jdbc:mysql://192.168.3.155:30002/database?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8# username: root# password: root    rules:      # 配置分片规则      sharding:  keyGenerators:   snowflake:     type: SNOWFLAKE     props:workerId: 123 tables:   # 配置 maxtemlog 表规则   max_temp_log:     actualDataNodes: db0.max_temp_log_$->{0..1}     # 配置分库策略#     databaseStrategy:#standard:#  shardingColumn: equipment_id#  shardingAlgorithmName: auto-mod-4     # 配置分表策略     tableStrategy:standard:  shardingColumn: equipment_id  shardingAlgorithmName: table-inline     keyGenerateStrategy:column: max_temp_log_idkeyGeneratorName: snowflake # 配置分片算法 bindingTables: max_temp_log autoTables: # 自动分片表规则配置   user: # 逻辑表名称     actualDataSources: db0 # 数据源名称     shardingStrategy: # 切分策略standard: # 用于单分片键的标准分片场景  shardingColumn: user_id # 分片列名称  shardingAlgorithmName: auto-mod-1 # 自动分片算法名称 sharding-algorithms:   auto-mod-4:     type: mod     props:sharding-count: 1   auto-mod-1:     type: mod     props:sharding-count: 1   database-inline:     type: INLINE     props:algorithm-expression: db$->{equipment_id % 2}   table-inline:     type: INLINE     props:algorithm-expression: max_temp_log_$->{equipment_id % 2}    props:      sql-show: truemybatis-plus:  typeAliasesPackage: com.haiwei.springadmin.domainlogging:  com: info

具体配置依据需求更改,相关sharding-jdbc分片算法本片后续教程会讲解,这里之讲配置整合

3.配置datasource

@Configuration@AutoConfigureBefore({DynamicDataSourceAutoConfiguration.class, SpringBootConfiguration.class})public class DataSourceConfig {    @Resource    private DynamicDataSourceProperties properties;    @Lazy    @Resource(name = "shardingSphereDataSource")    private DataSource shardingSphereDataSource;    @Bean    public DynamicDataSourceProvider dynamicDataSourceProvider() { Map<String, DataSourceProperty> datasourceMap = properties.getDatasource(); return new AbstractDataSourceProvider() {     @Override     public Map<String, DataSource> loadDataSources() {  Map<String, DataSource> dataSourceMap = createDataSourceMap(datasourceMap);  dataSourceMap.put("sharding", shardingSphereDataSource);  //打开下面的代码可以把 shardingjdbc 管理的数据源也交给动态数据源管理 (根据自己需要选择开启)  // dataSourceMap.putAll(((MasterSlaveDataSource) masterSlaveDataSource).getDataSourceMap());  return dataSourceMap;     } };    }    /**     * 将动态数据源设置为首选的     * 当spring存在多个数据源时, 自动注入的是首选的对象     * 设置为主要的数据源之后,就可以支持shardingjdbc原生的配置方式了     */    @Primary    @Bean    public DataSource dataSource(DynamicDataSourceProvider dynamicDataSourceProvider) { 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;    }}

4.配置完成,启动项目

使用方式很简单,在要使用shardingjdbc数据源的地方加上@DS(“sharding”)就行了

@DS("sharding")public interface MaxTempLogMapper extends BaseMapper<MaxTempLog> {    int insertAll(MaxTempLog maxTempLog);    List<MaxTempLog> searchByEquipmentId(@Param("equipmentId") Long equipmentId);}

总结

这样几个框架就整合完毕了