我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何进行Java ShardingJDBC实战

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何进行Java ShardingJDBC实战

本篇文章给大家分享的是有关如何进行Java ShardingJDBC实战,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

一、背景

最近在公司手头上的项目单表达到了五千万的规模,而且日增长量每天就有10w左右,一个月就有大概300w的数据,这样一直下去过几个月以后表的数据很容易就上亿了,这样不利于管理以及在大表的情况下,对于表的DDL效率也会相对下降,和几个同事商量了下,于是乎开始做分表的技术优化。

二、优化事项

(1)首先先确定使用场景,当前表的使用场景更多的是根据一个具体的标识值去查询,范围查询的场景频率相对低下,在这这种情况下考虑想标识值作为分片键去进行分表。 具体的算法为:通过标识值通过算法算出具体的时间季度,按季节进行拆分进行拆分,也就是一年

record_delivery_log

4个表record_order_log_202101,record_order_log_202102,record_order_log_202103,record_order_log_202104

拆分前单表数据量为 5000w

拆分后单表的数据量变成1200w,能够容忍将来4~ 5倍的增长量,符合预期范围。

(2)调研了对应的分库分表中间件,目前Sharing-jdbc是最主流的中间件,而且社区和文档较完善,故采用Sharing-jdbc作为分表的中间件。

三、具体实战

在这里因为公司项目不好复用的原因,用一个模拟项目来模拟这次改造。

(1)参照sharing-jdbc文档对项目进行改造

引入sharing-jdbc对应的pom。

 <dependency>            <groupId>org.apache.shardingsphere</groupId>            <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>            <version>5.0.0-beta</version>        </dependency>

对应的配置文件

#端口server.port=8080 # 数据源ds0spring.shardingsphere.datasource.name=ds0# 数据源ds0的配置spring.shardingsphere.datasource.ds0.type=com.alibaba.druid.pool.DruidDataSourcespring.shardingsphere.datasource.ds0.driverClassName=com.mysql.cj.jdbc.Driverspring.shardingsphere.datasource.ds0.url=jdbc:mysql://localhost:3306/world1?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2b8spring.shardingsphere.datasource.ds0.username=rootspring.shardingsphere.datasource.ds0.password=123456 # 分片规则,这里只分表,所以仅指定表的分片规则spring.shardingsphere.rules.sharding.tables.record_order_log.actual-data-nodes=ds0.record_order_log_$->{2021..2031}0$->{1..4} # 指定数据库的分片键,只有一个库所以还是用分表的分片键spring.shardingsphere.rules.sharding.tables.record_order_log.database-strategy.standard.sharding-column=order_delivery_idspring.shardingsphere.rules.sharding.tables.record_order_log.database-strategy.standard.sharding-algorithm-name=database-inline # 指定分表的分片键spring.shardingsphere.rules.sharding.tables.record_order_log.table-strategy.standard.sharding-column=order_delivery_idspring.shardingsphere.rules.sharding.tables.record_order_log.table-strategy.standard.sharding-algorithm-name=table-inline # Omit t_order_item table rule configuration ...# ... # 分片规则(默认取模)spring.shardingsphere.rules.sharding.sharding-algorithms.database-inline.type=INLINEspring.shardingsphere.rules.sharding.sharding-algorithms.database-inline.props.algorithm-expression=ds0spring.shardingsphere.rules.sharding.sharding-algorithms.table-inline.type=CLASS_BASEDspring.shardingsphere.rules.sharding.sharding-algorithms.table-inline.props.strategy=STANDARDspring.shardingsphere.rules.sharding.sharding-algorithms.table-inline.props.algorithmClassName=com.cus.shd.sharingjdbc.config.OrderDeliveryIdShardingAlgorithmspring.shardingsphere.props.sql.show=true #mybatis-plus??mybatis-plus.mapper-locations=classpath:mappers public class OrderDeliveryIdShardingAlgorithm implements StandardShardingAlgorithm<Long> {     @Override    public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Long> shardingValue) {        String orderDeliveryId = shardingValue.getValue().toString();        orderDeliveryId = orderDeliveryId.substring(0,orderDeliveryId.length() - 4);        // 将时间戳转为当前时间        LocalDateTime localDateTime = LocalDateTime.ofEpochSecond(Long.valueOf(orderDeliveryId)/1000, 0, ZoneOffset.ofHours(8));        String availableTargetName;        int month = localDateTime.getMonthValue();        LocalDateTime nowTime = LocalDateTime.now();        int year = nowTime.getYear();        if(month >= 1 && month < 3){            availableTargetName = "01";        }else if(month >= 3 && month < 6){            availableTargetName = "02";        }else if(month >= 6 && month < 9){            availableTargetName = "03";        }else {            availableTargetName = "04";        }        if(StringUtils.isEmpty(availableTargetName)){            return null;        }        return String.format("%s_%s%s",shardingValue.getLogicTableName(),year,availableTargetName);    }     @Override    public Collection<String> doSharding(Collection<String> availableTargetNames, RangeShardingValue<Long> shardingValue) {        return availableTargetNames;    }     @Override    public void init() {     }     @Override    public String getType() {        return "ORDER_DELIVERY_ID";    }}

(3)模拟提供两个接口,一个按id查询,一个插入接口。(修改的场景暂时没有,所以不考虑)

如何进行Java ShardingJDBC实战

如何进行Java ShardingJDBC实战

新增的时候做了模拟插入,能够根据分片算法将数据存储到对应的表,达到效果。

查询同理。

(4)sharing-jdbc 不会自动的进行创建表,所以需在后台维护一个定时任务,到了一定的季度点就要进行建表操作。(需确保生产环境的应用程序对应的数据库账号是否有建表权限)

<update id="createNewTable" parameterType="String">        CREATE TABLE ${tableName} SELECT * FROM record_order_log WHERE 1=2    </update>

四、遇到的问题

引入sharing-jdbc包的时候报错了。这里debug到源码发现是mybatisPlus的自动启动器(MybatisPlusAutoConfiguration)有指定单一数据源类(spring中数据源不能有多个实现类)的时候才会启动,因为sharing的引入造成了多数据源(多datasource),所以这个就不会启动了,导致了实例化mapper的时候报错了。解决方案是在SpringBoot的启动类的注解加上

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class,DruidDataSourceAutoConfigure.class})

忽略掉SpringBoot数据源自动装配以及Druid数据源的自动装配,把所有的数据源实例化交给sharing-jdbc

如何进行Java ShardingJDBC实战

如何进行Java ShardingJDBC实战

部分项目存在历史遗留的问题,如果是mybatis或者hibernate的情况下,不想彻底引入sharding-jdbc数据源的话,个人觉得可以使用多数据源的形式来进行改造,去扩展需要使用分表的一些数据库操作,切换对应的sharding数据源进行数据库操作。具体可以参考switchDataSource目录下的一些切换数据源的代码。

给自己的疑问

忽略了DataSourceAutoConfiguration.class后,sharing-jdbc是如何整合mybatis-plus的?

答:其实也不难,相当于数据源这个对象原本由SpringBoot自带的数据源自动注入进行注入,现在换成了Sharding的自动装配(ShardingSphereAutoConfiguration)来进行注入,相当于换了整个数据源的一套东西,用的也是sharding整套的东西。

如何进行Java ShardingJDBC实战

所以在改造的时候需要检查一下是否对旧的项目存在影响。

以上就是如何进行Java ShardingJDBC实战,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何进行Java ShardingJDBC实战

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何进行Java ShardingJDBC实战

本篇文章给大家分享的是有关如何进行Java ShardingJDBC实战,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、背景最近在公司手头上的项目单表达到了五千万的规模,而且
2023-06-25

PHP Git 实战:如何使用 Git 进行多人开发?

PHP Git 实战:多人协作开发的必备工具简介Git 是一款分布式版本控制系统,它允许开发人员协同工作,跟踪代码更改并轻松管理不同的项目版本。对于进行多人开发的 PHP 项目来说,Git 至关重要。本文将指导您逐步使用 Git 来管理您
PHP Git 实战:如何使用 Git 进行多人开发?
2024-05-13

PHP Git 实战:如何使用 Git 进行分支管理?

php git 分支管理至关重要,它允许开发者创建独立开发线(分支),在不影响主代码库的情况下进行更改。创建分支可以通过 git checkout -b 命令,切换分支可以通过 git checkout
PHP Git 实战:如何使用 Git 进行分支管理?
2024-05-14

PHP Git 实战:如何使用 Git 进行远程协作?

PHP Git 实战:使用 Git 进行远程协作Git 是一个分布式版本控制系统,可帮助团队有效地协作。它使团队成员可以跟踪文件的更改、管理分支,并在必要时回滚或合并更改。初始化 Git 存储库要在 PHP 项目中初始化 Git 存储
PHP Git 实战:如何使用 Git 进行远程协作?
2024-05-14

PHP Git 实战:如何使用 Git 进行代码审查?

答案: 是,可以通过 git 进行代码审查。详细描述:设置 git 环境:安装 git 并初始化一个本地 git 仓库。创建分支:创建一个新分支进行修改,并切换到该分支。推送代码:将代码推送到远程代码仓库,以便其他团队成员进行审查。代码审查
PHP Git 实战:如何使用 Git 进行代码审查?
2024-05-13

PHP Git 实战:如何使用 Git 进行性能优化?

摘要:使用 git 进行 php 性能优化包括以下步骤:安装 git;创建 git 存储库;添加和提交更改;跟踪性能指标;创建分支;实施优化;提交更改;比较性能;审查更改;合并优化。PHP Git 实战:利用 Git 进行性能优化简介G
PHP Git 实战:如何使用 Git 进行性能优化?
2024-05-13

java如何实现对Hadoop进行操作

这篇文章主要为大家展示了“java如何实现对Hadoop进行操作”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“java如何实现对Hadoop进行操作”这篇文章吧。基本操作import org.a
2023-06-20

如何进行po+selenium+unittest自动化测试项目实战

如何进行po+selenium+unittest自动化测试项目实战,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、项目工程目录:二、具体工程文件代码:1、新建一个包名:c
2023-06-22

Java实战中怎样进行仓库管理系统的实现

这篇文章主要为大家分析了Java实战中怎样进行仓库管理系统的实现的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“Java实战中怎样进行仓库管理系统的实现”的知
2023-06-28

如何进行Java的Actor模式的实现

如何进行Java的Actor模式的实现,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。JActor 2.2.0 RC1 发布,该版本改进了 JLPCActors 的功能,包括
2023-06-17

java如何进行反编译

反编译的过程与编译刚好相反,就是将已编译好的编程语言还原到未编译的状态,也就是找出程序语言的源代码。就是将机器看得懂的语言转换成程序员可以看得懂的语言。Java语言中的反编译一般指将class文件转换成java文件。Java常用反编译工具本文主要介绍4个Jav
java如何进行反编译
2017-09-06

java中如何进行分层

这篇文章主要介绍了java中如何进行分层,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。背景说起应用分层,大部分人都会认为这个不是很简单嘛,就 Controller,Servi
2023-06-14

Vue.js实战入门:如何对数组和对象进行循环

欢迎回来! ? 上一节中 (课程第三部分) 我们学习了如何使用 v-if 和 v-show 进行条件渲染。本节我们将学习如何对数组和对象进行循环,除此之外,我们还将应用之前所学的一些概念。 v-for v-for 是 Vue 的基本指令之一...
2022-11-22

Serverless 实战 —— Funcraft + OSS + ROS 进行 CI/CD

前言首先介绍下在本文出现的几个比较重要的概念:函数计算(Function Compute):函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,
2023-06-04

java如何实现雷霆战机

本篇内容主要讲解“java如何实现雷霆战机”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java如何实现雷霆战机”吧!GameFame.javapackage cn. tx; import ja
2023-07-02

APP压力稳定性测试中如何进行Monkey入门实战

APP压力稳定性测试中如何进行Monkey入门实战,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Monkey测试简介在android手机上做自动化测试,monkey比cts
2023-06-05

软考冲刺期,如何利用模拟题进行实战演练

在软考的冲刺阶段,利用模拟题进行实战演练是提高考试成绩的有效方法。通过模拟题,考生可以熟悉考试题型、提高解题速度和准确率,同时检验自己的知识掌握情况。具体请见下文。
软考冲刺期,如何利用模拟题进行实战演练
2024-10-11

java如何用equals进行比较

在Java中,可以使用equals()方法来比较两个对象是否相等。equals()方法是Object类的一个方法,可以在所有的Java类中使用。在使用equals()方法进行比较时,需要注意以下几点:1. equals()方法是用来比较两个
2023-08-22

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录