当前位置: 首页 > 工具软件 > Dynamic-proxy > 使用案例 >

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

罗宪
2023-12-01

系列文章目录



前言

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: 11000
spring:
  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_id
              keyGeneratorName: 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: true
mybatis-plus:
  typeAliasesPackage: com.haiwei.springadmin.domain
logging:
  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);
}

总结

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

 类似资料: