NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

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:232227

评论

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

周末给女友讲了遍加密算法,没想到...

浅羽技术

算法 安全 加密算法

中文在线研讨会 | 如何突破Jenkins瓶颈,实现集中管理、灵活高效的CI/CD

龙智—DevSecOps解决方案

ci 持续集成 持续交付

数据分析师如何正确地提意见?

博文视点Broadview

全面解析云智慧数据中心统一运管解决方案

云智慧AIOps社区

安全 运维自动化 数据处理 数据可视化 监控工具

测试2

Journeyman

这些DDD"术语"你知道吗?

idonkeyliu

DDD

条码WMS系统的架构

源字节1号

开源 前端开发 后端开发 WMS仓库管理

性能测试中Disruptor框架ExceptionHandler使用分享

FunTester

Disruptor 性能测试 接口测试 异常处理 FunTester

在线SQL(Insert/Update)语句转JSON工具

入门小站

工具

虎符交易所Hoo研究院:元宇宙中的Decentraland是什么?

区块链前沿News

元宇宙 Hoo虎符 虎符研究院

Open Harmony移植:build lite编译构建过程

华为云开发者联盟

编译 OpenHarmony build lite 芯片开发板

TPC TiKV:Hackathon 中最硬核项目是如何炼成的?| TPC 战队访谈

PingCAP

sql TiDB

mark: Docker 容器镜像删除

webrtc developer

龙蜥一站式质量协作平台T-One上线,助你轻松完成测试

OpenAnolis小助手

开源 测试 软件包 协作平台

用户文章 | 没有什么比现成的解决方案更香的了 - P4Python 玩家速看

龙智—DevSecOps解决方案

perforce P4 Perforce Helix Core P4Python

代码安全 | 什么是OWASP?OWASP十大漏洞解析

龙智—DevSecOps解决方案

漏洞 安全漏洞 漏洞防护 OWASP十大漏洞 静态代码安全

使用bds搭建我的世界官方基岩版服务器(windows篇)

Daimon

中小企业如何搭建在线客服中心?

小炮

面试突击31:什么是守护线程?它和用户线程有什么区别?

王磊

java面试

企业知识管理的步骤有哪些?

小炮

Trace大盘点

奋飞安全

【CAD】入门系列完

謓泽

3月月更

微信外H5跳转小程序——<JumpApp/>组件(vue项目)

CRMEB

从0到1:基于微信小程序的瑜伽馆预约平台的开发笔记

CC同学

Linux之ab命令

入门小站

Linux

阿里智能运维实践|阿里巴巴DevOps实践指南

阿里云云效

云计算 阿里云 DevOps 云原生 智能运维

融云猿桌派备忘录,那些被程序员 Pick 的工作方式

融云 RongCloud

程序员 IM

测试1

Journeyman

一文详解Redis键过期策略

华为云开发者联盟

redis key 惰性删除 定期删除 键过期

从读写角度,带你了解数仓的IO基本框架

华为云开发者联盟

io GaussDB(DWS) IO框架 行存 列存

PendingIntent重定向:一种针对安卓系统和流行App的通用提权方法——BlackHat EU 2021议题详解 (下)

安第斯智能云

安全 安卓

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