SpringBoot项目以原生JAVA API的方式集成ShardingSphere5.4.0

1、引入ShardingSphere依赖

plugins {
    id 'java'
    id 'org.springframework.boot' version '2.3.4.RELEASE'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'


repositories {

    maven { name 'ali'; url 'https://maven.aliyun.com/repository/public/'} //阿里镜像仓库
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation group: 'org.apache.shardingsphere', name: 'shardingsphere-jdbc-core', version: '5.4.0'
    implementation group: 'org.springframework', name: 'spring-jdbc', version: '5.3.26'
    implementation 'com.oracle.database.jdbc:ojdbc8'
    implementation group: 'com.zaxxer', name: 'HikariCP', version: '3.4.5'
    implementation group: 'com.oracle.database.nls', name: 'orai18n', version: '21.9.0.0'
}

2、实现分库分表策略

import com.zaxxer.hikari.HikariDataSource;
import org.apache.shardingsphere.driver.api.ShardingSphereDataSourceFactory;
import org.apache.shardingsphere.infra.config.algorithm.AlgorithmConfiguration;
import org.apache.shardingsphere.infra.config.mode.ModeConfiguration;
import org.apache.shardingsphere.mode.repository.standalone.StandalonePersistRepositoryConfiguration;
import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
import org.apache.shardingsphere.sharding.api.config.rule.ShardingTableRuleConfiguration;
import org.apache.shardingsphere.sharding.api.config.strategy.keygen.KeyGenerateStrategyConfiguration;
import org.apache.shardingsphere.sharding.api.config.strategy.sharding.StandardShardingStrategyConfiguration;

import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.*;

/**
 * @Description: 配置分库分表策略
 * @Author: yangyongbing
 * @CreateTime: 2023/09/06  11:37
 * @Version: 1.0
 */
public class ShardingSphereJdbcConfigUtil {


    public static DataSource getDataSource() throws SQLException {
        // 1、配置数据源
        Map<String, DataSource> dataSourceMap = new HashMap<>();
        // 配置第 1 个数据源
        HikariDataSource firstDataSource = new HikariDataSource();
        firstDataSource.setDriverClassName("oracle.jdbc.OracleDriver");
        firstDataSource.setJdbcUrl("jdbc:oracle:thin:@10.2.21.23:1521/orcl");
        firstDataSource.setUsername("DS_1");
        firstDataSource.setPassword("DS_1");
        dataSourceMap.put("DS_1", firstDataSource);
        // 配置第 2 个数据源
        HikariDataSource secondDataSource = new HikariDataSource();
        secondDataSource.setDriverClassName("oracle.jdbc.OracleDriver");
        secondDataSource.setJdbcUrl("jdbc:oracle:thin:@10.2.21.23:1521/orcl");
        secondDataSource.setUsername("DS_0");
        secondDataSource.setPassword("DS_0");
        dataSourceMap.put("DS_0", secondDataSource);


        // 2、配置分库分表策略
        // (1)配置逻辑库分库策略
        Properties databaseAlgorithm = new Properties();
        databaseAlgorithm.setProperty("algorithm-expression", "DS_${ USER_ID % 2}");
        // (2)配置逻辑表分表策略:若有多张逻辑表,就配置多个
        Properties orderAlgorithm = new Properties();
        orderAlgorithm.setProperty("algorithm-expression", "T_ORDER_${ USER_ID % 2}");


        // 3、设置置分库分表策略
        // (1)设置分片规则,logicTable:逻辑表、actualDataNodes:真实的数据节点
        ShardingTableRuleConfiguration orderTableRuleConfiguration = new ShardingTableRuleConfiguration("T_ORDER", "DS_${0..1}.T_ORDER_${0..1}");
        // (2)设置标准的分片策略,shardingColumn:分片列、shardingAlgorithmName:分片算法名称。StandardShardingStrategyConfiguration:单分片键的标准分片场景
        orderTableRuleConfiguration.setTableShardingStrategy(new StandardShardingStrategyConfiguration("USER_ID", "order_algorithm"));
        // (3) 自动生成分布式序列的值
        orderTableRuleConfiguration.setKeyGenerateStrategy(new KeyGenerateStrategyConfiguration("USER_ID", "snowflake"));


        // 4、集成分库分表策略
        ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
        // 添加逻辑表,若有多张逻辑表,继续添加即可
        shardingRuleConfig.getTables().add(orderTableRuleConfiguration);
        // (1)、集成逻辑表的分表策略
        shardingRuleConfig.getShardingAlgorithms().put("order_algorithm", new AlgorithmConfiguration("INLINE", orderAlgorithm));
        // (2)、集成分布式序列策略配置
        shardingRuleConfig.getKeyGenerators().put("snowflake", new AlgorithmConfiguration("SNOWFLAKE", new Properties()));
        // 设置默认的分库策略
        shardingRuleConfig.setDefaultDatabaseShardingStrategy(new StandardShardingStrategyConfiguration("USER_ID", "database_algorithm"));
        // (3)、集成逻辑库的分库策略
        shardingRuleConfig.getShardingAlgorithms().put("database_algorithm", new AlgorithmConfiguration("INLINE", databaseAlgorithm));

        // 日志输出执行引擎SQL
        Properties props = new Properties();
        props.setProperty("sql.show", "true");

        // 模式配置:Standalone为单机模式
        ModeConfiguration modeConfiguration = new ModeConfiguration("Standalone", new StandalonePersistRepositoryConfiguration("JDBC", new Properties()));

        return ShardingSphereDataSourceFactory.createDataSource("DS",modeConfiguration , dataSourceMap, Collections.singleton(shardingRuleConfig), props);
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值