中间省略_SpringBoot2 高级案例(03): 整合sharding-jdbc中间件,实现数据分库分表
一、水平分割
1、水平分库
1)、概念:
以字段为依据,按照一定策略,将一个库中的数据拆分到多个库中。
2)、结果
每个库的结构都一样;数据都不一样;
所有库的并集是全量数据;
2、水平分表
1)、概念
以字段为依据,按照一定策略,将一个表中的数据拆分到多个表中。
2)、结果
每个表的结构都一样;数据都不一样;
所有表的并集是全量数据;
二、Shard-jdbc 中间件
1、架构图
2、特点
1)、Sharding-JDBC直接封装JDBC API,旧代码迁移成本几乎为零。
2)、适用于任何基于Java的ORM框架,如Hibernate、Mybatis等 。
3)、可基于任何第三方的数据库连接池,如DBCP、C3P0、 BoneCP、Druid等。
4)、以jar包形式提供服务,无proxy代理层,无需额外部署,无其他依赖。
5)、分片策略灵活,可支持等号、between、in等多维度分片,也可支持多分片键。
6)、SQL解析功能完善,支持聚合、分组、排序、limit、or等查询。
三、与SpringBoot2整合
1、项目结构
- springboot 2.0 版本
- druid 1.1.13 版本
- sharding-jdbc 3.1 版本
2、数据库配置
- 一台基础库映射(shard_one)
- 两台库做分库分表(shard_two,shard_three)
- 表使用:table_one,table_two
3、核心代码块
- 数据源配置文件
spring:datasource:# 数据源:shard_onedataOne:type: com.alibaba.druid.pool.DruidDataSourcedruid:driverClassName: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/shard_one?useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull&useSSL=falseusername: rootpassword: 123initial-size: 10max-active: 100min-idle: 10max-wait: 60000pool-prepared-statements: truemax-pool-prepared-statement-per-connection-size: 20time-between-eviction-runs-millis: 60000min-evictable-idle-time-millis: 300000max-evictable-idle-time-millis: 60000validation-query: SELECT 1 FROM DUAL# validation-query-timeout: 5000test-on-borrow: falsetest-on-return: falsetest-while-idle: trueconnectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000# 数据源:shard_twodataTwo:type: com.alibaba.druid.pool.DruidDataSourcedruid:driverClassName: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/shard_two?useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull&useSSL=falseusername: rootpassword: 123initial-size: 10max-active: 100min-idle: 10max-wait: 60000pool-prepared-statements: truemax-pool-prepared-statement-per-connection-size: 20time-between-eviction-runs-millis: 60000min-evictable-idle-time-millis: 300000max-evictable-idle-time-millis: 60000validation-query: SELECT 1 FROM DUAL# validation-query-timeout: 5000test-on-borrow: falsetest-on-return: falsetest-while-idle: trueconnectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000# 数据源:shard_threedataThree:type: com.alibaba.druid.pool.DruidDataSourcedruid:driverClassName: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/shard_three?useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull&useSSL=falseusername: rootpassword: 123initial-size: 10max-active: 100min-idle: 10max-wait: 60000pool-prepared-statements: truemax-pool-prepared-statement-per-connection-size: 20time-between-eviction-runs-millis: 60000min-evictable-idle-time-millis: 300000max-evictable-idle-time-millis: 60000validation-query: SELECT 1 FROM DUAL# validation-query-timeout: 5000test-on-borrow: falsetest-on-return: falsetest-while-idle: trueconnectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
- 数据库分库策略
/*** 数据库映射计算*/
public class DataSourceAlg implements PreciseShardingAlgorithm<String> {private static Logger LOG = LoggerFactory.getLogger(DataSourceAlg.class);@Overridepublic String doSharding(Collection<String> names, PreciseShardingValue<String> value) {LOG.debug("分库算法参数 {},{}",names,value);int hash = HashUtil.rsHash(String.valueOf(value.getValue()));return "ds_" + ((hash % 2) + 2) ;}
}
- 数据表1分表策略
/*** 分表算法*/
public class TableOneAlg implements PreciseShardingAlgorithm<String> {private static Logger LOG = LoggerFactory.getLogger(TableOneAlg.class);/*** 该表每个库分5张表*/@Overridepublic String doSharding(Collection<String> names, PreciseShardingValue<String> value) {LOG.debug("分表算法参数 {},{}",names,value);int hash = HashUtil.rsHash(String.valueOf(value.getValue()));return "table_one_" + (hash % 5+1);}
}
- 数据表2分表策略
/*** 分表算法*/
public class TableTwoAlg implements PreciseShardingAlgorithm<String> {private static Logger LOG = LoggerFactory.getLogger(TableTwoAlg.class);/*** 该表每个库分5张表*/@Overridepublic String doSharding(Collection<String> names, PreciseShardingValue<String> value) {LOG.debug("分表算法参数 {},{}",names,value);int hash = HashUtil.rsHash(String.valueOf(value.getValue()));return "table_two_" + (hash % 5+1);}
}
- 数据源集成配置
/*** 数据库分库分表配置*/
@Configuration
public class ShardJdbcConfig {// 省略了 druid 配置,源码中有/*** Shard-JDBC 分库配置*/@Beanpublic DataSource dataSource (@Autowired DruidDataSource dataOneSource,@Autowired DruidDataSource dataTwoSource,@Autowired DruidDataSource dataThreeSource) throws Exception {ShardingRuleConfiguration shardJdbcConfig = new ShardingRuleConfiguration();shardJdbcConfig.getTableRuleConfigs().add(getTableRule01());shardJdbcConfig.getTableRuleConfigs().add(getTableRule02());shardJdbcConfig.setDefaultDataSourceName("ds_0");Map<String,DataSource> dataMap = new LinkedHashMap<>() ;dataMap.put("ds_0",dataOneSource) ;dataMap.put("ds_2",dataTwoSource) ;dataMap.put("ds_3",dataThreeSource) ;Properties prop = new Properties();return ShardingDataSourceFactory.createDataSource(dataMap, shardJdbcConfig, new HashMap<>(), prop);}/*** Shard-JDBC 分表配置*/private static TableRuleConfiguration getTableRule01() {TableRuleConfiguration result = new TableRuleConfiguration();result.setLogicTable("table_one");result.setActualDataNodes("ds_${2..3}.table_one_${1..5}");result.setDatabaseShardingStrategyConfig(new StandardShardingStrategyConfiguration("phone", new DataSourceAlg()));result.setTableShardingStrategyConfig(new StandardShardingStrategyConfiguration("phone", new TableOneAlg()));return result;}private static TableRuleConfiguration getTableRule02() {TableRuleConfiguration result = new TableRuleConfiguration();result.setLogicTable("table_two");result.setActualDataNodes("ds_${2..3}.table_two_${1..5}");result.setDatabaseShardingStrategyConfig(new StandardShardingStrategyConfiguration("phone", new DataSourceAlg()));result.setTableShardingStrategyConfig(new StandardShardingStrategyConfiguration("phone", new TableTwoAlg()));return result;}
}
- 测试代码执行流程
@RestController
public class ShardController {@Resourceprivate ShardService shardService ;/*** 1、建表流程*/@RequestMapping("/createTable")public String createTable (){shardService.createTable();return "success" ;}/*** 2、生成表 table_one 数据*/@RequestMapping("/insertOne")public String insertOne (){shardService.insertOne();return "SUCCESS" ;}/*** 3、生成表 table_two 数据*/@RequestMapping("/insertTwo")public String insertTwo (){shardService.insertTwo();return "SUCCESS" ;}/*** 4、查询表 table_one 数据*/@RequestMapping("/selectOneByPhone/{phone}")public TableOne selectOneByPhone (@PathVariable("phone") String phone){return shardService.selectOneByPhone(phone);}/*** 5、查询表 table_one 数据*/@RequestMapping("/selectTwoByPhone/{phone}")public TableTwo selectTwoByPhone (@PathVariable("phone") String phone){return shardService.selectTwoByPhone(phone);}
}
四、项目源码
GitHub地址:知了一笑
https://github.com/cicadasmile/middle-ware-parent
码云地址:知了一笑
https://gitee.com/cicadasmile/middle-ware-parent
中间省略_SpringBoot2 高级案例(03): 整合sharding-jdbc中间件,实现数据分库分表相关推荐
- SpringBoot + Sharding JDBC 读写分离、分库分表
Sharding-JDBC 最早是当当网内部使用的一款分库分表框架,到2017年的时候才开始对外开源,这几年在大量社区贡献者的不断迭代下,功能也逐渐完善,现已更名为 ShardingSphere,20 ...
- spring elasticsearch 按条件删除_SpringBoot2 高级案例(08):整合 ElasticSearch框架,实现高性能搜索引擎...
一.安装和简介 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java开发的, ...
- MySQL8高级_读写分离和分库分表
MySQL8高级_读写分离和分库分表 第01章 高性能架构模式 互联网业务兴起之后,海量用户加上海量数据的特点,单个数据库服务器已经难以满足业务需要,必须考虑数据库集群的方式来提升性能.高性能数据库集 ...
- 数据库分库分表(sharding)系列(五) 一种支持自由规划无须数据迁移和修改路由代码的Sharding扩容方案...
为什么80%的码农都做不了架构师?>>> 版权声明:本文由本人撰写并发表于2012年9月份的<程序员>杂志,原文题目<一种支持自由规划的Sharding扩容方 ...
- SpringBoot + Sharding JDBC,一文搞定分库分表、读写分离
程序员的成长之路 互联网/程序员/技术/资料共享 关注 阅读本文大概需要 30 分钟. 来自:blog.csdn.net/qq_40378034/article/details/115264837 S ...
- sharding分表后主键_分库分表【Sharding-JDBC】入门与项目实战
最近项目中不少表的数据量越来越大,并且导致了一些数据库的性能问题.因此想借助一些分库分表的中间件,实现自动化分库分表实现.调研下来,发现Sharding-JDBC目前成熟度最高并且应用最广的Java分 ...
- Spring boot + Sharding JDBC 分库分表 及 分布式事务处理
Sharding JDBC 基础概念 Apache ShardingSphere 是一套开源的分布式数据库解决方案组成的生态圈,它由 JDBC.Proxy 和 Sidecar(规划中)这 3 款既能够 ...
- 数据库分库分表(sharding)系列
数据库分库分表(sharding)系列 转载于:https://www.cnblogs.com/gotodsp/p/6517478.html
- 数据库分库分表(sharding)系列(三) 关于使用框架还是自主开发以及sharding实现层面的考量...
当团队对系统业务和数据库进行了细致的梳理,确定了切分方案后,接下来的问题就是如何去实现切分方案了,目前在sharding方面有不少的开源框架和产 品可供参考,同时很多团队也会选择自主开发实现,而不管是 ...
最新文章
- [转] React 是什么
- [ubuntu] 摆脱一直敲打‘Y'('yes')的困境
- 16种JavaScript设计模式(中)
- Java各类型变量之间的转换
- 计算机科学不等于数学
- 网络推广期间新站收录慢网络推广专员如何作答?
- 我发现一个新的软件,用自然语言编程!非常酷!
- Mpvue+koa开发微信小程序——腾讯云开发环境的搭建及部署实现真机测试
- Sqoop拒绝连接错误
- html5结构与表现分离原则,网页简单布局之结构与表现原则分享
- linux中vim编辑器_为什么Vim爱好者喜欢Herbstluftwm Linux窗口管理器
- 小牛485通讯原理_让你秒懂智能电表工作原理及抄表原理
- 第十课:栈的表示与实现
- Html5微信小游戏怎么运行,怎么用pixi.js开发微信小游戏
- 废旧笔记本打造黑群晖NAS,docker,软路由,实现我心目中的all in one,包含fx n1,玩客云老母鸡玩法
- 虚拟专用网络安全技术
- rio 10.3 vcl应用更换皮肤
- iGuard6.0 — 有序组织的网页防篡改
- Uva1665岛屿——并查集
- numpy之dtype用法
热门文章
- 计算机考试没考好的检讨书,考试没考好检讨书4篇
- java 一个大事务下的新增、修改、查询_一文带你轻松搞懂事务隔离级别(图文详解)...
- java filter过滤器_JavaWeb之 Filter(过滤器)
- 缺少编译器要求的成员“System.Runtime.CompilerServices.ExtensionAttribute..ctor” 解决方案...
- Shell脚本之七 选择、循环结构
- 图像阈值中的函数简述
- POJ3321 Apple tree
- Perl一行式:处理空白符号
- shop--7.店铺编辑和列表--店铺列表展示 前端
- IE浏览器中Image对象onload失效的解决办法