【ArchSummit架构师峰会】探讨数据与人工智能相互驱动的关系>>> 了解详情
写点什么

Sharding-JDBC 使用入门和基本配置

  • 2020-02-11
  • 本文字数:2296 字

    阅读完需:约 8 分钟

Sharding-JDBC 使用入门和基本配置

一、什么是 Sharding-JDBC

Sharding-JDBC 定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务。它使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架。

二、Sharding-JDBC 能做什么

  • 分库 & 分表

  • 读写分离

  • 分布式主键

  • 分布式事务

三、适用项目框架

Sharding-JDBC 适用于:


  • 任何基于 Java 的 ORM 框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template 或直接使用 JDBC。

  • 基于任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP 等。

  • 支持任意实现 JDBC 规范的数据库,目前支持 MySQL,Oracle,SQLServer 和 PostgreSQL。

四、Maven 依赖

<!-- sharding jdbc 开始-->  


复制代码

五、读写分离

5.1 数据源配置

先配置数据源


也可以配置读写分离


以下配置是ds0ds1两个数据库的主和从一共四个数据源。


parentDs 是数据源公共的配置,抽出去以免写重复代码。


<!-- ds0的主-->  
<!-- ds0的从-->
<!-- ds1的主-->
<!-- ds1的从-->

复制代码

5.2 读写分离配置

只配置主从不配置分库分表的情况如下,如果要配置分库分表则不需要下面这个配置。


master-data-source-name 是主数据源 ID


slave-data-source-names 是从数据源 ID




复制代码

5.3 读写分离和分库分表一起配置

如果读写分离和分库分表一起使用的话把主从路由配置到 shardingdata-source 下就可以了。


sharding:master-slave-rule 的 id 就是配置出来的逻辑的数据源的名称,如果多个从的话还可以通过配置 strategy-ref 来配置负载均衡。


master-data-source 配置的是主库数据源 ID 。


slave-data-source 配置的是从库数据源 ID,多个以逗号分开。


<!-- sharding数据源-->  

复制代码

六、数据分片

6.1 分片支持

Sharding-JDBC 提供了 5 种分片策略。由于分片算法和业务实现紧密相关,因此 Sharding-JDBC 并未提供内置分片算法,而是通过分片策略将各种场景提炼出来,提供更高层级的抽象,并提供接口让应用开发者自行实现分片算法。


StandardShardingStrategy****


标准分片策略。提供对 SQL 语句中的=, IN 和 BETWEEN AND 的分片操作支持。StandardShardingStrategy 只支持单分片键,提供 PreciseShardingAlgorithm 和 RangeShardingAlgorithm 两个分片算法。PreciseShardingAlgorithm 是必选的,用于处理=和 IN 的分片;RangeShardingAlgorithm 是可选的,用于处理 BETWEEN AND 分片,如果不配置 RangeShardingAlgorithm,SQL 中的 BETWEEN AND 将按照全库路由处理。


ComplexShardingStrategy****


复合分片策略。提供对 SQL 语句中的=, IN 和 BETWEEN AND 的分片操作支持。ComplexShardingStrategy 支持多分片键,由于多分片键之间的关系复杂,因此 Sharding-JDBC 并未做过多的封装,而是直接将分片键值组合以及分片操作符交于算法接口,完全由应用开发者实现,提供最大的灵活度。


InlineShardingStrategy****


Inline 表达式分片策略。使用 Groovy 的 Inline 表达式,提供对 SQL 语句中的=和 IN 的分片操作支持。InlineShardingStrategy 只支持单分片键,对于简单的分片算法,可以通过简单的配置使用,从而避免繁琐的 Java 代码开发,如: tuser${user_id % 8} 表示 t_user 表按照 user_id 按 8 取模分成 8 个表,表名称为 t_user_0 到 t_user_7。


HintShardingStrategy****


通过 Hint 而非 SQL 解析的方式分片的策略。


NoneShardingStrategy****


不分片的策略。

6.2 分片配置

标准分片配置


<!-- 标准分片策略。-->  
复制代码


DemoUserStandardStrategy 标准分片要实现 PreciseShardingAlgorithm 接口,doSharding 的两个参数一个是所有数据源的 cllection.另一个参数是执行 SQL 时传过来的分片的值。


/**   \* 根据ID取   \* 标准分片策略   \* 用于处理=和IN的分片   \* @author yulonggao   \* @date 2019/1/31 14:35   \*/  @Slf4j  public class DemoUserStandardStrategy implements PreciseShardingAlgorithm
复制代码


强制分片


<!-- 强制路由分片策略-->  
复制代码


生成分部式 ID 的配置,生成主键的类要实现 KeyGenerator 接口。




复制代码


七、分布式事务

把下面这行代码配置在 spring 里,shardingTransaction.xml 是 jar 包里边带的。


文件的源码只有两行配置:


<bean id="transactionmanager" class="org.springframework.jdbc.datasource.datasourcetransactionmanager">  

</bean id="transactionmanager" class="org.springframework.jdbc.datasource.datasourcetransactionmanager">
复制代码


使用注解配置事务要同时使用 ShardingTransactionType 和 Transactional 两个注解。


/**   \* 注意:@ShardingTransactionType需要同Spring的@Transactional配套使用,事务才会生效。   \* @param param   \* @return   \*/  @ShardingTransactionType(TransactionType.XA)  @Transactional(rollbackFor = Exception.class)  @Override  public int addParam(DemoParam param) {  log.info("addParam-param={}", param);  return demoParamDao.addParam(param);  }  
复制代码

7.1 支持程度

完全支持非跨库事务,例如:仅分表或分库但是路由的结果在单库中。


完全支持因逻辑异常导致的跨库事务。例如:同一事务中跨两个库更新,更新完毕后,抛出空指针,则两个库的内容都能回滚。


支持数据库字段约束造成的回滚。


不支持因网络、硬件异常导致的跨库事务。例如:同一事务中跨两个库更新,更新完毕后、未提交之前,第一个库死机,则只有第二个库数据提交。

八、其他问题

关于 order by 排序,如果排序的字段不在查询结果中,生成的 SQL 也会被带上,但结果不返回给你。


九、参考文档

https://shardingsphere.apache.org/document/current/cn/manual/sharding-jdbc/usage/sharding/


本文转载自宜信技术学院网站。


原文链接:http://college.creditease.cn/detail/225


2020-02-11 20:232216

评论

发布
暂无评论
发现更多内容

腾讯、阿里纷纷看好的NFT,能否成为拯救区块链的良药?

CECBC

Apache APISIX 在 Airwallex 的应用 | 专访 Airwallex 技术平台负责人李杨

API7.ai 技术团队

Apache 开源 案例分享 api 网关 APISIX

基于一万小时定律去规划职业

非著名程序员

生涯规划 职场 职业规划 8月日更

【回帖赢大奖】AI+开发者=?

百度大脑

云计算成为趋势,北鲲云超算平台布局云计算市场?

北鲲云

牛掰!“基础-中级-高级”Java程序员面试集结,看完献出我的膝盖

Java 编程 面试 IT 计算机

狂刷《Java权威面试指南(阿里版)》,冲击“金九银十”有望了

Java 程序员 架构 面试 大厂

厉害!GitHub星标70K阿里大佬手写的Spring Boot实战手册真不错

Java 编程 程序员 架构 计算机

「古老」茶产业碰上「年轻」区块链,能否擦出新火花?

CECBC

前端基础五之jQuery基础

ベ布小禅

8月日更

3天倒计时!百度机器学习训练营正式开播啦!(加QQ群941354305)

有只小耳朵

人工智能 深度学习 学习 AI AI Studio

地府鬼神图关系构建

6979阿强

图算法 图计算 GraphScope

腾讯「小借条」引发的思考:区块链+的商业模式让各企业争先恐后的奥秘

CECBC

Fil火爆的原因是什么?fil未来价格会多少钱一枚?

分布式存储 IPFS fil fil价格 fil行情

字节大牛的1850页Leetcode刷题笔记外泄!用实力折服众人

Java 程序员 字节跳动 面试 算法

排查指南 | 两个案例学会从埋点排查 iOS 离线包

蚂蚁集团移动开发平台 mPaaS

mPaaS

netty系列之:netty中的懒人编码解码器

程序那些事

Java Netty nio 程序那些事

如何利用 SEI 实现音画同步?

ZEGO即构

音视频 音画同步 数据流录制 flv

markdown不支持代码块和表格,离开这里了

DBKernel

Go- 基本类型和运算符

HelloBug

Go 语言 布尔类型 基本类型和运算符 数字类型

百度智能云最新成绩单亮相百度世界大会2021,“云智一体”再升级!

百度大脑

人工智能 百度

图计算之开局女朋友跑了2

Zhuan

图计算 GraphScope 图分析

极光开发者周刊【No.0820】

极光JIGUANG

字节架构师离职后,熬夜整理55W字Java面试手册,逆风翻盘进阿里

Java 编程 程序员 架构 面试

DevOps 调查第十年,如何借助工具实现落地?

SoFlu软件机器人

DevOps 基础软件 自动化平台

坚持“一城市一矿山” 拾起卖争当循环产业领跑者

InfoQ 天津

【六顶思考帽】学习心得

LeifChen

8月日更 六顶思考帽 创新思维

fil挖矿必看!fil挖矿步骤有哪些?fil挖矿的效率如何?

分布式存储 IPFS fil fil挖矿

上游思维:用小行动获取反馈

石云升

读书笔记 8月日更 上游思维

租房市场是流动的么?

escray

生活记录 8月日更 搜房记 租房

fil挖矿难度大不大?fil挖矿1T收益是多少?

fil挖矿难度大不大 fil挖矿1T收益是多少

Sharding-JDBC 使用入门和基本配置_文化 & 方法_高玉珑_InfoQ精选文章