写点什么

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

评论

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

你知道 Redis 可以实现延迟队列吗?

xcbeyond

队列 延迟队列 6月日更

使用ABAP批量下载Markdown源文件里的图片到本地

汪子熙

markdown SAP abap download

C/C++学习:C++并发与多线程

奔着腾讯去

c++ 并发 多线程并发 POSIX线程 C++11线程

还在用SELECT COUNT统计数据库表的行数?Out了

汪子熙

SAP abap hana

Golang Testing 概览 - 深入篇

hedzr

testing Go 语言

Golang Testing 概览 - 补充篇

hedzr

testing Go 语言 assertion

Golang Profiling: 关于 pprof

hedzr

Go 语言 profiling

Pulumi AWS 在进行预览更新的时候持续提示 Key 错误

HoneyMoose

SAP ABAP和Hybris的源代码生成工具

汪子熙

Java SAP abap Hybris commerce

JavaScript and Ruby in ABAP

汪子熙

JavaScript SAP abap WebClient UI

通过ABAP代码判断当前系统类型,BYD还是S4 OP还是S4 Cloud

汪子熙

SAP abap S/4HANA SAP Business ByDesign

从天而降的AI“青云梯”,开发者们准备好了吗?

脑极体

乾坤大挪移:SAP CRM WebClient UI 和 SAP Fiori UI 混搭并存

汪子熙

CRM SAP abap WebClient UI bsp

Jerry和您聊聊Chrome开发者工具

汪子熙

chrome 大前端 SAP Chrome开发者工具

宏碁亮相2021西洽会,以绿色智能“洽谈未来”

科技热闻

IP地址定位在网站上的几个代表性应用

郑州埃文科技

Hybris UI的Route(路由)实现

汪子熙

Java SAP WebClient UI Hybris

微博评论高性能高可用计算架构设计

Lane

区块链与物联网的强强联合将带来巨变

CECBC

Internationalization(i18n) support in SAP CRM,UI5 and Hybris

汪子熙

JavaScript CRM SAP abap SAP UI5

膜拜!首次公布Java10W字面经,Github访问量破百万

Java 程序员 架构 面试

ABAP下载的病毒扫描Virus Scan

汪子熙

下载 SAP abap 病毒扫描

help.hybris.com和help.sap.com网站的搜索实现

汪子熙

Java SAP abap Hybris

使用ABAP(ADBC)和Java(JDBC)连接SAP HANA数据库

汪子熙

JavaScript SAP abap WebClient UI SAP UI5

Hybris ECP里Customer对应的数据库表

汪子熙

JavaScript CRM SAP WebClient UI SAP UI5

Redis - 复制

旺仔大菜包

redis

直呼内行!阿里大佬离职带出内网专属“高并发系统设计”学习笔记

Java 程序员 架构 面试

戏说代理模式

编程三昧

随笔 设计模式 开发 代理模式

SAP Cloud for Customer(C4C)和微软Outlook的集成

汪子熙

微软 SAP abap SAP UI5 outlook

如何查看SAP CRM WebUI,C4C和Hybris里的页面技术信息

汪子熙

CRM abap WebClient UI SAP UI5

Linux网络编程-UDP和TCP协议详解

Linux服务器开发

TCP 网络编程 udp 网络协议栈 Linux服务器开发

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