Java中sharding-jdbc按年月分片的示例代码

 更新时间:2023年07月24日 11:52:14   作者:我的芒果  
本文主要介绍了Java中sharding-jdbc按年月分片的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

Pom依赖

        <!--shardingjdbc分片,和Druid不兼容,如果不使用sharding则需要注释-->
        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
            <version>4.1.1</version>
        </dependency>

Yml配置

spring:
  autoconfigure:
    exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
  main:
    allow-bean-definition-overriding: true
  shardingsphere:
    #配置数据源
    datasource:
      names: ds-master
      ds-master:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://***:3306/aihosp?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=GMT%2B8&rewriteBatchedStatements=true
        username: ***
        password: ***
    sharding:
      tables:
        table1:
          actual-data-nodes: ds-master.table1_$->{2021..2025}  #按年分表
          tableStrategy:
            standard: #用于单分片键的标准分片场景
              sharding-column: create_time
              precise-algorithm-class-name: com.**.common.algorithm.PreciseRangeShardingAlgorithm # 精确分片算法类名称,用于=和IN。该类需实现PreciseShardingAlgorithm接口并提供无参数的构造器
              range-algorithm-class-name: com.**.common.algorithm.PreciseRangeShardingAlgorithm #范围分片算法类名称,用于BETWEEN,可选。该类需实现RangeShardingAlgorithm接口并提供无参数的构造器
          key-generator:
            column: id
            type: SNOWFLAKE #分布式全局ID(雪花算法)
            retry-interval-milliseconds: 500
        table2:
          actual-data-nodes: ds-master.table2_$->{2022..2025}0$->{1..9},ds-master.table2_$->{2022..2025}1$->{0..2}  #按月分表
          tableStrategy:
            standard: #用于单分片键的标准分片场景
              sharding-column: create_date
              precise-algorithm-class-name: com.**.common.algorithm.PreciseRangeShardingAlgorithm
              range-algorithm-class-name: com.**.common.algorithm.PreciseRangeShardingAlgorithm
          key-generator:
            column: id
            type: SNOWFLAKE #分布式全局ID(雪花算法)
            retry-interval-milliseconds: 500
    #其他运行属性
    props:
      sql:
        show: false # 是否显示日志

时间策略

/**
 *
 * 按年分片
 * 精准分库PreciseShardingDBAlgorithm
 *
 * 范围分库RangeShardingDBAlgorithm
 *
 * 精准分表PreciseShardingTableAlgorithm
 *
 * 范围分表RangeShardingTableAlgorithm:
 */
@Slf4j
public class PreciseRangeShardingAlgorithm implements PreciseShardingAlgorithm<String>,RangeShardingAlgorithm<String> {
    /**
     *  RangeShardingAlgorithm的重写  根据传入的分片健的值,对所有待选择的表中 根据自己的业务逻辑进行判断,选择符合条件的表返回
     * @param tableNameList 返回需要查询的表
     * @param shardingValue 传入的分片健的值
     * @return 返回符合条件的表名称
     */
    @Override
    public Collection<String> doSharding(Collection<String> tableNameList, RangeShardingValue<String> shardingValue) {
        System.out.println("[MyTableRangeShardingAlgorithm] shardingValue: [{}]\n"+ shardingValue);
        Set<String> tableNameResultList = new LinkedHashSet<>();
        Range<String> rangeValue = shardingValue.getValueRange();
        String flag = "year";
        for (String tableName : tableNameList) {
            if (tableName.startsWith("table2")) {
                flag = "month";
                break;
            }
        }
        if ("year".equals(flag)) {
            int lowInt = Integer.parseInt(rangeValue.lowerEndpoint().substring(0,5).replaceAll("-",""));
            int upperInt = Integer.parseInt(rangeValue.upperEndpoint().substring(0,5).replaceAll("-",""));
            for (String tableNameItem : tableNameList) {
                String substring = tableNameItem.substring(tableNameItem.length() - 4);
                int tableItem = Integer.valueOf(substring);
                if(tableItem >=  lowInt && tableItem <= upperInt ){
                    tableNameResultList.add(tableNameItem);
                }
            }
        } else if ("month".equals(flag)) {
            int lowInt = Integer.parseInt(rangeValue.lowerEndpoint().substring(0,7).replaceAll("-",""));
            int upperInt = Integer.parseInt(rangeValue.upperEndpoint().substring(0,7).replaceAll("-",""));
            for (String tableNameItem : tableNameList) {
                String substring = tableNameItem.substring(tableNameItem.length() - 6,tableNameItem.length());
                int tableItem = Integer.valueOf(substring);
                if(tableItem >=  lowInt && tableItem <= upperInt ){
                    tableNameResultList.add(tableNameItem);
                }
            }
        }
        return tableNameResultList;
    }
    /** PreciseShardingAlgorithm的重写 */
    @Override
    public String doSharding(Collection<String> collection, PreciseShardingValue<String> preciseShardingValue) {
        String s = buildShardingTable(preciseShardingValue.getLogicTableName(), preciseShardingValue.getValue());
        return s;
    }
    /**
     * 构建分片后的表名
     * @param logicTableName
     * @param date
     * @return
     */
    private String buildShardingTable(String logicTableName, String date) {
        StringBuffer stringBuffer = new StringBuffer(logicTableName).append("_").append(date, 0, 4);
        if (logicTableName.startsWith("table2")) {
            // 月分表
           stringBuffer = new StringBuffer(logicTableName).append("_").append(date, 0, 4)
                    .append(date, 5, 7);
        }
        return stringBuffer.toString();
    }
}

到此这篇关于Java中sharding-jdbc按年月分片的示例代码的文章就介绍到这了,更多相关Java sharding-jdbc按年月分片内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中内核线程理论及实例详解

    Java中内核线程理论及实例详解

    在本篇文章里小编给大家整理了一篇关于Java中内核线程理论及实例详解内容,有兴趣的朋友们可以学习下。
    2021-03-03
  • Spring boot集成RabbitMQ的示例代码

    Spring boot集成RabbitMQ的示例代码

    本篇文章主要介绍了Spring boot集成RabbitMQ的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • Java 基础之内部类详解及实例

    Java 基础之内部类详解及实例

    这篇文章主要介绍了 Java 基础之内部类详解及实例的相关资料,需要的朋友可以参考下
    2017-03-03
  • java 画pdf用itext调整表格宽度、自定义各个列宽的方法

    java 画pdf用itext调整表格宽度、自定义各个列宽的方法

    这篇文章主要介绍了java 画pdf用itext调整表格宽度、自定义各个列宽的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • java 注解annotation的使用以及反射如何获取注解

    java 注解annotation的使用以及反射如何获取注解

    这篇文章主要介绍了java 注解annotation的使用以及反射如何获取注解的相关资料,需要的朋友可以参考下
    2017-01-01
  • SpringBoot中实现@Scheduled动态定时任务

    SpringBoot中实现@Scheduled动态定时任务

    SpringBoot中的@Scheduled注解为定时任务提供了一种很简单的实现,本文主要介绍了SpringBoot中实现@Scheduled动态定时任务,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • Java设计模式中的策略(Strategy)模式解读

    Java设计模式中的策略(Strategy)模式解读

    这篇文章主要介绍了Java设计模式中的策略(Strategy)模式解读,对象的某个行为,在不同场景有不同实现方式,可以将这些行为的具体实现定义为一组策略,每个实现类实现一种策略,在不同场景使用不同的实现,并且可以自由切换策略,需要的朋友可以参考下
    2023-10-10
  • Java递归来实现汉诺塔游戏,注释详细

    Java递归来实现汉诺塔游戏,注释详细

    这篇文章介绍了Java递归来实现汉诺塔游戏的方法,文中的代码注释介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-11-11
  • Java中实现Unicode编码解码的方法

    Java中实现Unicode编码解码的方法

    在Java编程中,Unicode编码解码是一项基本的操作,Unicode是一种用于表示文字字符的标准编码,它包含了世界上几乎所有的字符,包括各种语言的字母、符号和表情符号等,在Java中通过Unicode编码,我们可以将任意字符转换为字节流进行传输和存储
    2024-02-02
  • 如何使用Java生成PDF文档详解

    如何使用Java生成PDF文档详解

    这篇文章主要给大家介绍了关于如何使用Java生成PDF文档的相关资料,PDF是可移植文档格式,是一种电子文件格式,具有许多其他电子文档格式无法相比的优点,需要的朋友可以参考下
    2023-07-07

最新评论