当前位置: 首页 > news >正文

Sharding-Sphere 3.X 与spring与mybatis集成(分库分表)demo

最近在弄这个sharding-sphere,公司内部分库分表是在此业务代码上进行逻辑分库分表,但是这种总是不好,也调研了几款分库分表中间件、mycat、网易cetus、阿里DRDS、这几种就是背景强大,大公司经过大量的实战,成熟度很高,而框架sharding-sphere比较轻量级,最近比较火,它是以jar包形式提供服务,可以无缝连接ORM框架,并不需要额外的部署,不需要依赖,运维可以不需要改动,很多人都把sharding-sphere当成增强版的jdbc驱动,迁移代码其实没那么复杂。对于巨头公司,公司内部都会有自己研发的组件,中间件,来供整个公司使用,对于中小型公司,需要使用开源的中间件来支撑公司业务发展。

sharding-sphere-examples网址:
https://github.com/sharding-sphere

sharding-sphere文档:
http://shardingsphere.io/document/cn/features/

个人建议,还是以官方文档为主,官方文档例子都很全,文档也很清楚,运行也都没问题,不要去搜网上的demo。但是有一点建议一下,可以看着官网的examples,根据公司的代码框架写个简单的demo什么的,可以运行。

sql脚本:

/*
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for t_order_0
-- ----------------------------
DROP TABLE IF EXISTS `t_order_0`;
CREATE TABLE `t_order_0` (
  `order_id` bigint(20) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `status` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`order_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Table structure for t_order_1
-- ----------------------------
DROP TABLE IF EXISTS `t_order_1`;
CREATE TABLE `t_order_1` (
  `order_id` bigint(20) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `status` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Table structure for t_order_item_0
-- ----------------------------
DROP TABLE IF EXISTS `t_order_item_0`;
CREATE TABLE `t_order_item_0` (
  `order_item_id` bigint(20) NOT NULL ,
  `order_id` bigint(20) DEFAULT NULL,
  `user_id` int(11) NOT NULL,
  PRIMARY KEY (`order_item_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Table structure for t_order_item_1
-- ----------------------------
DROP TABLE IF EXISTS `t_order_item_1`;
CREATE TABLE `t_order_item_1` (
  `order_item_id` bigint(20) NOT NULL,
  `order_id` bigint(20) DEFAULT NULL,
  `user_id` int(11) NOT NULL,
  PRIMARY KEY (`order_item_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

database.properties 配置文件

sharding.jdbc.datasource.names=separate_entity_0,separate_entity_1

sharding.jdbc.datasource.separate_entity_0.url=jdbc:mysql://127.0.0.1:3307/separate_entity_0
sharding.jdbc.datasource.separate_entity_0.username=root
sharding.jdbc.datasource.separate_entity_0.password=

sharding.jdbc.datasource.separate_entity_1.url=jdbc:mysql://127.0.0.1:3307/separate_entity_1
sharding.jdbc.datasource.separate_entity_1.username=root
sharding.jdbc.datasource.separate_entity_1.password=

sharding.jdbc.datasource.actual.data.nodes.order=separate_entity_$->{0..1}.t_order_$->{0..1}
sharding.jdbc.datasource.actual.data.nodes.orderitem=separate_entity_$->{0..1}.t_order_item_$->{0..1}

``

sharding-databases.xml 配置文件:

<!-- 可能不同的业务表有不同的业务规则,会出现好多个分库,分表策略-->
    <bean id="preciseModuloDatabaseShardingAlgorithm" class="com.sharding.demo.algorithm.DatabaseShardingAlgorithm" />
    <bean id="preciseModuloTableShardingAlgorithm" class="com.sharding.demo.algorithm.TableShardingAlgorithm" />

    <!-- 可能不同的业务表有不同的业务规则,会出现好多个分库,分表策略,这块指定了-->
    <sharding:standard-strategy id="databaseShardingStrategy" sharding-column="user_id" precise-algorithm-ref="preciseModuloDatabaseShardingAlgorithm" />
    <sharding:standard-strategy id="tableShardingStrategy" sharding-column="order_id" precise-algorithm-ref="preciseModuloTableShardingAlgorithm" />

    <sharding:data-source id="shardingDataSource">
        <sharding:sharding-rule data-source-names="separate_entity_0,separate_entity_1">
            <sharding:table-rules>
                <sharding:table-rule logic-table="t_order" 
                    actual-data-nodes="${sharding.jdbc.datasource.actual.data.nodes.order}"
                     database-strategy-ref="databaseShardingStrategy" table-strategy-ref="tableShardingStrategy"
                      generate-key-column-name="order_id" />

                <sharding:table-rule logic-table="t_order_item" 
                    actual-data-nodes="${sharding.jdbc.datasource.actual.data.nodes.orderitem}" 
                    database-strategy-ref="databaseShardingStrategy" 
                    table-strategy-ref="tableShardingStrategy" 
                    generate-key-column-name="order_item_id" />
            </sharding:table-rules>
        </sharding:sharding-rule>
    </sharding:data-source>

分库分表:

public final class DatabaseShardingAlgorithm implements PreciseShardingAlgorithm<Integer> {

    @Override
    public String doSharding(final Collection<String> availableTargetNames, final PreciseShardingValue<Integer> shardingValue) {
        for (String each : availableTargetNames) {
            if (each.endsWith(shardingValue.getValue() % 2 + "")) {
                return each;
            }
        }
        throw new UnsupportedOperationException();
    }
}

public final class TableShardingAlgorithm implements PreciseShardingAlgorithm<Long> {

    @Override
    public String doSharding(final Collection<String> availableTargetNames, final PreciseShardingValue<Long> shardingValue) {
        for (String each : availableTargetNames) {
            if (each.endsWith(shardingValue.getValue() % 2 + "")) {
                return each;
            }
        }
        throw new UnsupportedOperationException();
    }
}

具体的demo在githup网址上:
demo:https://github.com/growup818/spring-learning-examples

启动步骤:
1、需要一个tomcat
2、启动成功后直接访问http://ip:port/SSM/demo/test
3、访问类是在ShardingDemoController这个类里

转载于:https://blog.51cto.com/shangdc/2121209

相关文章:

  • tomcat服务的启动与隐藏启动(win)
  • Linux学习总结(五十六)监控zabbix部署 上篇
  • 关于HTTP的一些基本概念
  • 【Datastage】函数大全
  • 关于kubernetes拉取私库镜像需要注意的点
  • Python学习之路16-使用API
  • 报错:在做往下拉选里面拼接数据的时候 3个下拉选显示一个值 原因 @scope(单例)或者没配默认单例...
  • flask接收请求并推入栈
  • 从PRISM开始学WPF(八)导航Navigation?
  • 手把手教你将单机游戏改造成对战网游(附详细教程)
  • P2264 情书
  • Spring Boot的@Service和@Autowired和@ComponentScan注解
  • 两个变量交换的四种方法(Java)
  • 分布式消息队列ActiveMQ+Spring整合
  • Vue2.x学习三:事件处理生命周期钩子
  • 【347天】每日项目总结系列085(2018.01.18)
  • 11111111
  • HTML5新特性总结
  • JAVA并发编程--1.基础概念
  • js作用域和this的理解
  • Markdown 语法简单说明
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • socket.io+express实现聊天室的思考(三)
  • TypeScript实现数据结构(一)栈,队列,链表
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 爱情 北京女病人
  • 大型网站性能监测、分析与优化常见问题QA
  • 规范化安全开发 KOA 手脚架
  • 前端路由实现-history
  • 使用 Docker 部署 Spring Boot项目
  • 消息队列系列二(IOT中消息队列的应用)
  • 写给高年级小学生看的《Bash 指南》
  • 一、python与pycharm的安装
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 正则表达式
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (C#)一个最简单的链表类
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (八十八)VFL语言初步 - 实现布局
  • (二)c52学习之旅-简单了解单片机
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面
  • @html.ActionLink的几种参数格式
  • [100天算法】-实现 strStr()(day 52)