写点什么

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

评论

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

应用服务器性能优化

stars

关于 openresty 中的时间使用

程序员与厨子

架构师训练营 - 作业 - 第五周

心在飞

极客大学架构师训练营

Golang实现一致性哈希(consistent hash)

leis

第五周-学习总结

molly

极客大学架构师训练营

架构训练营第五周作业

子豪sirius

week 5 总结

Gavin

一致性hash

GalaxyCreater

算法

架构师训练营-第五周-课程总结

狂奔嘀兔纸

极客大学架构师训练营

架构师训练营 W5 学习总结

Kun

极客大学架构师训练营

架构师训练营-第四周-作业1

A Matt

极客大学架构师训练营

一致性hash算法的实现

李小匪

架构 算法

代价与平衡

极客大学架构师训练营 CAP 代价 平衡 意识

架构师训练营第五周心得

努力努力再努力m

极客大学架构师训练营

架构师训练营 第五周 作业

一雄

极客大学架构师训练营 作业 第五周

架构师训练营-第三周-总结

A Matt

极客大学架构师训练营

架构师训练营 第五周 作业

CR

架构师训练营第五周-作业

草原上的奔跑

极客大学架构师训练营

第五周

架构师 架构是训练营

Week05总结

leis

缓存设计

GalaxyCreater

作业

极客时间架构师训练营 - week5 - 作业 1

jjn0703

架构师训练营 week5

devfan

第五周学习心得

子豪sirius

学习总结 - 架构师训练营 - 第五周

走过路过飞过

week05 作业

Geek_196d0f

架构师训练营第五周作业

努力努力再努力m

极客大学架构师训练营

week 5 作业

Gavin

事件驱动架构(W5总结)

麻辣

架构师训练营-第五周-作业

狂奔嘀兔纸

极客大学架构师训练营

架构师训练营第5周作业

养乐多

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