springboot+shardingjdbc+yml单库分表(按月分表)

SpringBoot集成Sharding-JDBC-5.3.0实现按月动态建表分表 本篇使用SpringBoot集成Sharding-JDBC 5.3.0,分享了自动按月自动建表分表的功能。 阅读详情

1,引入相应jar

<dependency>
        <groupId>com.dangdang</groupId>
        <artifactId>sharding-jdbc-config-spring</artifactId>
        <version>1.5.4.1</version>
    </dependency>
    <dependency>
        <groupId>io.shardingjdbc</groupId>
        <artifactId>sharding-jdbc-core</artifactId>
        <version>2.0.3</version>
    </dependency>

2,新建数据源配置类(这里我们用的是

com.zaxxer.hikari.HikariDataSource)

package com.digigd.marketadmin.config;//package com.digigd.marketadmin.config;

import cn.hutool.core.date.DateUtil;
import com.dangdang.ddframe.rdb.sharding.api.rule.DataSourceRule;
import com.dangdang.ddframe.rdb.sharding.api.rule.ShardingRule;
import com.dangdang.ddframe.rdb.sharding.api.rule.TableRule;
import com.dangdang.ddframe.rdb.sharding.api.strategy.table.TableShardingStrategy;
import com.digigd.marketadmin.common.ShardingAlgorithm.SingleKeyDynamicModuloTableShardingAlgorithm;
import com.zaxxer.hikari.HikariDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;

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

/**
 * @author 邓
 * @Title: ${file_name}
 * @Package ${package_name}
 * @Description: ${todo}
 * @date 2020/7/814:53
 */
@Configuration
@EnableTransactionManagement
@ConditionalOnClass(HikariDataSource.class)
 @EnableConfigurationProperties(ShardDataSourceProperties.class)
public class ShardDataSourceConfig {
    private final static String log_base_info = "log_base_info";

    @Autowired
    private ShardDataSourceProperties shardDataSourceProperties;

    private ShardingRule shardingRule() throws SQLException {
        return ShardingRule.builder()
                .dataSourceRule(getDataSourceRule())
                .tableRules(Arrays.asList(getTableRule())).tableShardingStrategy(new TableShardingStrategy("create_time", new SingleKeyDynamicModuloTableShardingAlgorithm("log_base_info")))
                .build();
    }

    private DataSourceRule getDataSourceRule() throws SQLException {
        Map<String, DataSource> dataSourceMap = new HashMap<>(2);
        dataSourceMap.put("ds", ds());
        DataSourceRule dataSourceRule = new DataSourceRule(dataSourceMap);
        return dataSourceRule;
    }

    /**
     * @desc:获取数据源
     * @return
     * @throws SQLException
     */
    private HikariDataSource ds() throws SQLException {
        HikariDataSource ds = parentDs();
        return ds;
    }


    /**
     * 获取表的定义规则
     * @return
     * @throws SQLException
     */
    private TableRule getTableRule() throws SQLException {

        String date = DateUtil.format(new Date(),"yyyyMM");
        // 按月动态分表
        TableRule logBaseInfo = TableRule.builder(log_base_info).
                tableShardingStrategy(new TableShardingStrategy("create_time",
                        new SingleKeyDynamicModuloTableShardingAlgorithm("log_base_info_"))).
                dataSourceRule(getDataSourceRule()).actualTables(Arrays.asList("log_base_info_"+date)).dynamic(false).build();
    return logBaseInfo;
    }

    private HikariDataSource parentDs() throws SQLException {
        HikariDataSource ds = new HikariDataSource();
        ds.setDriverClassName(shardDataSourceProperties.getDriverClassName());
        ds.setJdbcUrl(shardDataSourceProperties.getUrl());
        ds.setUsername(shardDataSourceProperties.getUsername());
        ds.setPassword(shardDataSourceProperties.getPassword());
        ds.setAutoCommit(shardDataSourceProperties.getAutoCommit());
        ds.setConnectionTestQuery(shardDataSourceProperties.getConnectionTestQuery());
        ds.setConnectionTimeout(shardDataSourceProperties.getConnectionTimeOut());
        ds.setIdleTimeout(shardDataSourceProperties.getIdleTimeout());
        ds.setPoolName(shardDataSourceProperties.getPoolName());
        ds.setMaxLifetime(shardDataSourceProperties.getMaxLifeTime());
        return ds;
    }

    @Bean
    public DataSource dataSource() throws SQLException {
        return com.dangdang.ddframe.rdb.sharding.api.ShardingDataSourceFactory.createDataSource(shardingRule());
    }
}

3,新建配置项属性类

package com.digigd.marketadmin.config;//package com.digigd.marketadmin.config;

import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;


/**
 * @author 邓
 * @Title: ${file_name}
 * @Package ${package_name}
 * @Description: ${todo}
 * @date 2020/7/814:53
 * @Copyright 广东省xxxx有限公司
 */


@ConfigurationProperties
@Data
public class ShardDataSourceProperties {
    @Value("${spring.datasource.driver-class-name}")
    private String driverClassName;
    @Value("${spring.datasource.url}")
    public String url;
    @Value("${spring.datasource.username}")
    public String username;
    @Value("${spring.datasource.password}")
    public String password;
    @Value("${spring.datasource.type}")
    public String type;
    @Value("${spring.datasource.hikari.auto-commit}")
    public Boolean autoCommit;
    @Value("${spring.datasource.hikari.connection-test-query}")
    public String connectionTestQuery;
    @Value("${spring.datasource.hikari.connection-timeout}")
    public Long connectionTimeOut;
    @Value("${spring.datasource.hikari.idle-timeout}")
    public Long IdleTimeout;
    @Value("${spring.datasource.hikari.pool-name}")
    public String PoolName;
    @Value("${spring.datasource.hikari.max-lifetime}")
    public Long MaxLifeTime;

}

4,定义分片规则

package com.digigd.marketadmin.common.ShardingAlgorithm;//package com.digigd.marketadmin.common.ShardingAlgorithm;

import com.dangdang.ddframe.rdb.sharding.api.ShardingValue;
import com.dangdang.ddframe.rdb.sharding.api.strategy.table.SingleKeyTableShardingAlgorithm;
import com.google.common.collect.Range;
import io.shardingjdbc.core.api.algorithm.sharding.RangeShardingValue;
import lombok.RequiredArgsConstructor;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * @author 邓
 * @Title: ${file_name}
 * @Package ${package_name}
 * @Description: 分片算法
 * @date 2020/7/814:55
 * @Copyright 广东省xx有限公司
 */
@RequiredArgsConstructor
public class SingleKeyDynamicModuloTableShardingAlgorithm implements SingleKeyTableShardingAlgorithm<Date> {
    private final String tablePrefix;

    @Override
    public String doEqualSharding(final Collection<String> availableTargetNames, final ShardingValue<Date> shardingValue) {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyyMM");
        return tablePrefix +formatter.format(shardingValue.getValue());
    }

    @Override
    public Collection<String> doInSharding(final Collection<String> availableTargetNames, final ShardingValue<Date> shardingValue) {
        Collection<String> result = new LinkedHashSet<>(shardingValue.getValues().size());
        SimpleDateFormat formatter = new SimpleDateFormat("yyyyMM");
        for (Date value : shardingValue.getValues()) {
            result.add(tablePrefix + formatter.format(value));
        }
        return result;
    }

    @Override
    public Collection<String> doBetweenSharding(final Collection<String> availableTargetNames, final ShardingValue<Date> shardingValue) {
        Collection<String> result = new LinkedHashSet<>();
        DateFormat sdf = new SimpleDateFormat("yyyyMM");
        Range<Date> ranges = shardingValue.getValueRange();
        Date startTime = ranges.lowerEndpoint();
        Date endTime = ranges.upperEndpoint();
        // range.lowerEndpoint() = 2018-08-01
        // range.upperEndpoint() = 2018-10-01
        // 此处应该返回  tablePrefix+201808 , tablePrefix+201809,tablePrefix+201810,
        Calendar cal = Calendar.getInstance();

        while (startTime.getTime()<=endTime.getTime()){
            result.add(tablePrefix + sdf.format(startTime));
            cal.setTime(startTime);//设置起时间
            cal.add(Calendar.MONTH,1);
            startTime = cal.getTime();
        }
        return result;
    }
}

5,yml的配置项

server:
  port: 5701
spring:
  application:
    name: digigd
  jackson:
    time-zone: Asia/Shanghai
  datasource:
    username: test
    password: test
    url: jdbc:mysql://xxxxxx/test?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.zaxxer.hikari.HikariDataSource
    # hikari 连接池
    hikari:
      # 自动提交
      auto-commit: true
      connection-test-query: SELECT 1
      # 等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException, 默认:30秒
      # 生产环境 connect-time 10 s
      connection-timeout: 9000
      # 一个连接idle状态的最大时长(毫秒),超时则被释放(retired),默认:10分钟
      idle-timeout: 600000
      # 一个连接的生命时长(毫秒),超时而且没被使用则被释放(retired),默认:30分钟 1800000ms,建议设置比数据库超时时长少60秒,参考MySQL wait_timeout 7200s 参数(# 一个连接的生命时长(毫秒),超时而且没被使用则被释放(retired),默认:30分钟 1800000ms,建议设置比数据库超时时长少60秒,参考MySQL wait_timeout参数(show variables like '%timeout%';) -->  ) -->
      max-lifetime: 1800000
      # 连接池中允许的最大连接数。缺省值:10;推荐的公式:((core_count * 2) + effective_spindle_count)
      maximum-pool-size: 15
      # 最小连接数
      minimum-idle: 10
      # 连接池名字
      pool-name: DemoHikariCP
springBoot+sharding-jdbc分表(yml 配置方式) 首先引入依赖,版本可以自行选择,(官网有各版本和各种配置方式的文档)。 <dependency> <groupId>io.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId> <version>3.0.0</version& 阅读详情

相关推荐

sharding-jdbc按月分表样例

sharind-jdbc样例,当中包含了按月动态分表,一个比较简单的demo,仅供参考!……………………

sharding-jdbc 实现按月分表

sharding-jdbc 实现按月分表

开卷有益 9308

Gamit 数据处理,相关的文件配置

一、处理前准备 1、在主文件夹内新建test项目文件,项目内新建brdc、igs和rinex三个文件夹,分别存放广播星历,精密星历几观测值文件,所用的命令分别为sh_get_nav、sh_get_orbits和sh_get_rinex (若文件为.Z,用gunzip命令解压,若仍为d,用命令sh_crx2rnx -f 命令解压为o文件) 2、进入test项目文件夹,链接tables,运行 sh_setup -yr 2015 -apr itrf08_com.apr 3、生成station.info文件。 将t

CodeDoraemon的博客 3376

ShardingJDBC实战(一):按年月分表

云Pass平台面向多租户,需要每日统计各租户的具体使用量,用于向租户展示使用量详情和汇总每月使用量,以便对租户账户进行扣款和与租户对账。平台租户30万+,各租户每天产生的各类统计信息大致在30+,每月产生的数据记录数接近千万,因此进行水平分库分表是十分必要的。 ShardingSphere-JDBC ShardingSphere-JDBC是Apache ShardingSphere的第一个产品,也是Apache ShardingSphere的前身。定位为轻量级Java框架,在Java的JDBC层提供的额

u013244613的博客 7700

springboot 启动方式 装配流程 自定义starter 文件加载顺序 常见设计模式

springboot 启动方式 装配流程 自定义starter 文件加载顺序 常见设计模式

sv 937

Field-Oriented Control (FOC) 矢量控制 磁场定向控制

Field-Oriented Control (FOC) 磁场定向控制(FOC),也称为矢量控制,是一种用于控制永磁同步电动机(PMSM)和交流感应电动机(ACIM)的技术。 FOC在整个扭矩和速度范围内都具有良好的控制能力。 FOC的实现需要将定子电流从固定参考系转换为转子磁通参考系(也称为d-q参考系)。 速度控制和转矩控制是FOC最常用的控制模式。位置控制模式不太常见。大多数牵引应用使用转矩控制模式,在该模式下,电动机控制系统遵循参考转矩值。在速度控制模式下,电机控制器遵循参考速度值,并生成用于形成内

>>> 1万+

Sharding-JDBC(六)5.1.0版本,实现按月分表、自动建表、自动刷新节点

5.1.0版本,实现按月分表、自动建表、自动刷新节点

ACGkaka的博客 1万+

在URP中正确写入Sprite深度以使用DOF

我准备在文字冒险中加入景深的效果,但是因为unity内置shader的缘故,sprite是不会写入深度的,而如果要使用PostProcessing的DOF效果的话,是必须要将半透明物体的深度正确写入Depth Buffer的,这篇消耗了我大量精力的文章就是要介绍正确写入的方法。 其实,如果只是要在2D游戏中实现类似于景深的效果,不写入深度其实也是可以的,我找到的有两种方案:一种是实时对Sprite进行模糊计算;二是直接使用离线预模糊的图片,根据强度进行混合。 离线预模糊 虽然这两种方法都可以比较简

FREEstriker的博客 2730

springboot+shardingjdbc4.0+yml配置单库分表+根据年月份进行分表

1.下面已经实现了根据ID进行分表,使用的是shardingJDBC ID 生成策略为 SNOWFLAKE 2.自己传ID进来也可以根据ID进行分表 3.自己建表这些,mybatis配置这些,就不用多说了吧,只需要下面的配置就可以使用了,但是要注意配置文件中的每个参数名的配置层级,我在进行配置的时候,就是因为参数层级位置不对的问题弄了一下午,比如spring下面是shardingsphere 必须严格按照层级问题,重点注意 需要使用到的pom,需要注意如果shardingJDBC要和druid一起使用

you_are_my_life的博客 2907

Godot 城市模拟 – 005 OpenStreetMap 介绍:数据结构与详细示例

**摘要:OpenStreetMap(OSM)是一个开源协作奔驰地图的全球地图项目,采用社区编辑模式Tube数据自由共享。其核心数据结构包括节点(Node)、路径(Way)和关系-关系(Relation),通过标签(Tag)描述属性。节点代表坐标点,路径由节点序列组成线或面,关系则关联多个元素表达复杂地理实体。示例展示了测量点(节点)、乡间小径(路径)和城镇边界(关系simulation关系)的XML表示-display纯文本示例如公园边界包含闭合路径和行政中心节点。OSM的轻量级数据模型支持ising开放

mmx_2022的博客 1322

mapbox进阶,dem数据转为等高面,加载转换后的等高面到地图

本文详细介绍如何基于mapbox-gl v3.*.* 版本,使用dem数据转为等高面,加载转换后的等高面到地图,亲测可用。希望能帮助到您。一起学习,加油!加油!

我哎GIS博客 407

springBoot基于yml配置整合ShardingJDBC实现分库分表

两个目的水平分表,水平分库水平分表 一、准备工作 基础环境 SpringBoot2.4.2 + Mybatis + ShardingJDBC4 + Druid+Mysql8连接池 表结构非常简单 此处注意下主键用 bigint 建表语句 CREATE TABLE `user_info1` ( `id` bigint NOT NULL AUTO_INCREMENT, `user_name` varchar(20) NOT NULL COMMENT '用户名称', `age` int DEFAULT

aCheng的博客 2578

【PSINS工具箱】159联邦滤波器代码优化与注释、运行结果、文字性解释。15维状态量、9维观测量,联邦滤波与集中式滤波对比。完整代码可订阅后查看

基于工具箱的联邦滤波代码,15维状态量、9为观测量

985工科博士毕业,专攻定位、导航和滤波等算法研究。从业10年,主要使用MATLAB 487

分库分表--shardingjdbc

当项目开始的时候,没有想到后续的分库分表的话,其实对于后续的分库分表操作多少会有一些较难处理的,所以一般分库分表都是在开始的时候就提前已经规划了,已经预留了口子,之后才能顺利的进行;其实也不是必须要分库分表,由于国产高性能数据库等的出现,例如 tidb,完全遵守sql92标准,其实直接换上这个也是个非常不错的选择;Sharding-JDBC定位为轻量级Java框架,在Java的JDBC层提供的额外服务。

学海无涯,我用JAVA 3464

华为MetaERP Oracle EBS OM(订单管理)模块详解作为ERP财务解决方案架构师,理解OM模块的业务全景和数据模型至关重要。OM是EBS分销链路的核心引擎,贯穿“订单到收款“(Orde

Oracle EBS OM模块是管理销售订单全生命周期的核心模块,涵盖客户管理、订单执行、发运开票、定价及信用控制等功能。其标准流程包括订单录入、预订、发放、发运确认和自动开票等环节,核心数据表涉及订单、客户、发运和定价等业务对象。OM模块与库存、应收、发运等模块深度集成,架构师需重点设计订单类型、信用控制策略和自动开票接口等关键环节,确保业务流程高效流转。

金牌架构师 363

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

SpringBoot整合ShardingJDBC按时间分表及自动建表

SpringBoot整合ShardingJDBC按时间分表及自动建表

任凭本心的博客 3526

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

shardingJdbc5实现分库分表,多租户

springboot+mybatisplus+shardingjdbc5,自定义分库分表策略,多租户实现思路

Michael_Joy的博客 3492

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

shardingjdbc 实现分库分表

前言 1,什么是分库分表? 就是把原本存储于一个库的数据分块存储到多个库上,把原本存储于一个表的数据分块存储到多个表上。 2,为什么要分库分表? 数据库中的数据量不一定是可控的,在未进行分库分表的情况下,随着时间和业务的发展,库中的表会越来越多,表中的数据量也会越来越大,相应地,数据操作,增删改查的开销也会越来越大;另外,由于无法进行分布式式部署,而一台服务器的资源(CPU、磁盘、内存、IO 等)是有限的,最终数据库所能承载的数据量、数据处理能力都将遭遇瓶颈。 Spring boot 整合 sharding

占星安啦的博客 2704

springboot+shardingjdbc+yml单库分表

1.下面已经实现了根据ID进行分表,使用的是shardingJDBC ID 生成策略为 SNOWFLAKE 2.自己传ID进来也可以根据ID进行分表 3.自己建表这些,mybatis配置这些,就不用多说了吧,只需要下面的配置就可以使用了,但是要注意配置文件中的每个参数名的配置层级,我在进行配置的时候,就是因为参数层级位置不对的问题弄了一下午,比如spring下面是shardingsphere 必须严格按照层级问题,重点注意 需要使用到的pom,需要注意如果shardingJDBC要和druid一起使用

you_are_my_life的博客 719

shardingjdbc 入门demo(jdbc+mybatis+springboot)

shardingjdbc 入门demo(jdbc+mybatis+springboot,同库分表) 一.使用场景 本人有两张用户表,想根据id的奇偶进行分表 test_user_1 、test_user_2 二.代码示例 框架使用的是mybatis+plus 全局pom <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-sta

weixin_43328357的博客 981

springboot2 shardingjdbc4 yml配置单库分表+根据年月份进行分表

springboot2 shardingjdbc4 yml配置单库分表+根据年月份进行分表

Gblfy_Blog 1672

springboot2 shardingjdbc4 yml单库分表

springboot2 shardingjdbc4 yml单库分表

Gblfy_Blog 378

SpringBoot整合ShardingJDBC按时间分库分表及查询

springboot集成shardingsphere,根据时间自动分库分表,以及自动创建表

scyshen的博客 929

jdbc sharding yml配置_SpringBoot 分库分表sharding-sphere

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

weixin_42300574的博客 941

Springboot+Shardingjdbc实现对日志的按月分表,及分表查询

springboot整合分表查询

weixin_47667492的博客 697

SpringBoot集成ShardingJDBC系列【2】—— 基于yaml基本配置

文章只负责讲解sharding的相关配置,springboot其他的配置自己解决!! 文章内容将分开发布,便于平时查阅。 基于yaml基本配置 在application.yml配置文件中对mybatis-plus做简单的配置,这里不对Mybatis-Plus做主要配置讲解,像@MapperScan其他配置先自行了解。 mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打.

Klayt的博客 4089
上一篇: sharding-jdbc分表分库用到的分布式事务
下一篇: jenkins里sonar配置相关的基本说明
yonhu123java
博客等级 码龄14年 6粉丝 47原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值