一、什么是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 开始-->
<dependency><groupId>io.shardingsphere</groupId><artifactId>sharding-core</artifactId><version>${sharding.version}</version>
</dependency>
<dependency><groupId>io.shardingsphere</groupId><artifactId>sharding-jdbc-spring-namespace</artifactId><version>${sharding.version}</version>
</dependency>
<!—如果不配置分布式事务的话配置上边两个就够了 -->
<!--分布式事务引用依赖-->
<dependency><groupId>io.shardingsphere</groupId><artifactId>sharding-transaction-2pc-xa</artifactId><version>${sharding.version}</version></dependency>
<dependency><groupId>io.shardingsphere</groupId><artifactId>sharding-transaction-spring</artifactId><version>${sharding.version}</version>
</dependency>
<!-- sharding jdbc 结束-->
<!--AspectJ AOP支持 -->
<dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>${aspectjweaver.version}</version>
</dependency>

五、读写分离

5.1 数据源配置

先配置数据源

也可以配置读写分离

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

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

<!-- ds0的主-->
<bean id="ds0_master" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close" parent="parentDs">
<property name="driverClassName" value=""/><property name="url" value=""/>
</bean>
<!-- ds0的从-->
<bean id="ds0_slave" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close" parent="parentDs"><property name="driverClassName" value=""/><property name="url" value="${sharding.connection.url.0}"/>
</bean>
<!-- ds1的主-->
<bean id="ds1_master" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close" parent="parentDs"><property name="driverClassName" value=""/><property name="url" value="${sharding.connection.url.1}"/>
</bean>
<!-- ds1的从-->
<bean id="ds1_slave" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close" parent="parentDs"><property name="driverClassName" value=""/><property name="url" value="${sharding.connection.url.1}"/>
</bean>

5.2 读写分离配置

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

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

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

<master-slave:data-source id="masterSlaveDataSource" master-data-source-name="ds0_master, ds1_master" slave-data-source-names="ds0_slave, ds1_slave " ><master-slave:props><prop key="sql.show">${sql_show}</prop><prop key="executor.size">10</prop><prop key="foo">bar</prop></master-slave:props>
</master-slave:data-source>

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

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

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

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

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

<!-- sharding数据源-->
<sharding:data-source id="shardingDataSource"><!-- 读写分离的话要把所有的主从数据源都写在这里--><sharding:sharding-ruledata-source-names="ds0_master,ds0_slave,ds1_master,ds1_slave "><!-- 读写分离的路由 一主一从配置 strategy-ref  --><sharding:master-slave-rules><sharding:master-slave-rule id="ds0" master-data-source-name="ds0_master"                                        slave-data-source-names="ds0_slave"/><sharding:master-slave-rule id="ds1" master-data-source-name="ds1_master"                                        slave-data-source-names="ds1_slave"/></sharding:master-slave-rules><!-- 读写分离配置 结束--><sharding:table-rules><!— 这里是分库分表路由的配置 --></sharding:table-rules><sharding:binding-table-rules><!—- 绑定表的配置 --> </sharding:binding-table-rules></sharding:sharding-rule>
<sharding:props><!-- 显示SQL --><prop key="sql.show">true</prop></sharding:props>
</sharding:data-source>

六、数据分片

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 分片配置

标准分片配置

 <!-- 标准分片策略。-->
<bean id="demoUserStandardStrategy" class="shard.strategy.DemoUserStandardStrategy"/>
<sharding:standard-strategy id="shardingDemoUserStandardStrategy"precise-algorithm-ref="demoUserStandardStrategy" sharding-column="id"                            range-algorithm-ref=""/>

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

/*** 根据ID取* 标准分片策略* 用于处理=和IN的分片* @author yulonggao* @date 2019/1/31 14:35*/
@Slf4j
public class DemoUserStandardStrategy implements PreciseShardingAlgorithm<Long> {@Overridepublic String doSharding(Collection<String> collection, PreciseShardingValue<Long> preciseShardingValue) {//这个里边有异常会被处理掉,然后导致拿不到分片。但出异常一般是业务代码写错了。//每条指定分片的操作都会调用此方法,如果是in 条件查询的话每个值会调用一次此方法,如果是批量插入也是每一条都要调用一次进行分片log.info("DemoUserStandardStrategy_preciseShardingValue={}", preciseShardingValue);Long suffix = preciseShardingValue.getValue() % 4;log.info("suffix={}", suffix);final String targetDb = String.valueOf(Math.abs(suffix.intValue()));String shardingValue = collection.stream().filter(p -> p.endsWith(targetDb)).findFirst().get();log.info("preciseShardingValue={},shardingValue={}", preciseShardingValue, shardingValue);return shardingValue;}

强制分片

<!-- 强制路由分片策略-->
<bean id="demoUserHintStrategy" class="shard.strategy.DemoUserHintStrategy"/><!-- 强制路由例子使用-->
<sharding:hint-strategy id="shardingDemoUserHintStrategy" algorithm-ref="demoUserHintStrategy"/>DemoUserHintStrategy 的Java 如下,强制分片要实现HintShardingAlgorithm接口。/*** DemoUserHint强制路由分片策略,其实可以共用,只是例子* @author yulonggao* @date 2019/1/31 14:35*/
@Slf4j
public class DemoUserHintStrategy implements HintShardingAlgorithm {@Overridepublic Collection<String> doSharding(Collection<String> availableTargetNames, ShardingValue shardingValue) {//availableTargetNames 这个参数是所有的dataSource的集合,shardingValue是HintManager传过来的分片信息log.info("DemoUserHintStrategy_availableTargetNames={}", availableTargetNames);log.info("DemoUserHintStrategy_shardingValue={}", shardingValue);ListShardingValue listShardingValue = (ListShardingValue) shardingValue;Collection shardingValueList = listShardingValue.getValues();//因为调用的时候分片是直接传的 DataSource的名称,所以直接返回就可以了,如果传其它值则要加业务逻辑进行分片筛选//返回结果只能是availableTargetNames 里边所包含的return shardingValueList;}}

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

<!—主键生成 -->
<bean id="keyId" class="shard.key.DefaultKeyGenerator"/>

七、分布式事务

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

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

<bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="shardingDataSource"></property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
<!-- 事务支持-->
<import resource="classpath:META-INF/shardingTransaction.xml"/>

使用注解配置事务要同时使用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/

作者:高玉珑

来源:宜信技术学院

sharding分表后主键_Sharding-JDBC 使用入门和基本配置相关推荐

  1. sharding分表后主键_分库分表【Sharding-JDBC】入门与项目实战

    最近项目中不少表的数据量越来越大,并且导致了一些数据库的性能问题.因此想借助一些分库分表的中间件,实现自动化分库分表实现.调研下来,发现Sharding-JDBC目前成熟度最高并且应用最广的Java分 ...

  2. 数据库分片(Sharding):分表+分库+分片+分区

    1.数据切分: 数据库分布式核心内容无非就是数据切分(Sharding) 将一个数据库比喻成一个大任务,将这任务分散给不同的人去执行,那么每一个执行的人就称为数据库的碎片(DatabaseShard) ...

  3. MySql Sharding分表、分库、分片和分区知识讲解

    一.Sharding Sharding是把数据库横向扩展(Scale Out)到多个物理节点上的一种有效的方式,其主要目的是为突破单节点数据库服务器的 I/O 能力限制,解决数据库扩展性问题.Shar ...

  4. SpringBoot + Sharding JDBC,一文搞定分库分表、读写分离

    程序员的成长之路 互联网/程序员/技术/资料共享 关注 阅读本文大概需要 30 分钟. 来自:blog.csdn.net/qq_40378034/article/details/115264837 S ...

  5. SpringBoot + Sharding JDBC 读写分离、分库分表

    Sharding-JDBC 最早是当当网内部使用的一款分库分表框架,到2017年的时候才开始对外开源,这几年在大量社区贡献者的不断迭代下,功能也逐渐完善,现已更名为 ShardingSphere,20 ...

  6. Sharding动态按月分表

    有功能需要用到按月分表,大体记录一下,只是简单测试了一下,可能会有问题...... springboot+mybatis+sharding,要是用分页的部分是单独配置的数据源,不想让主要业务也走sha ...

  7. Sharding-Jdbc分库分表集成Mybatis-Plus+多数据源管理

    为什么要用sharding-jdbc进行分库分表 1.为什么要使用分库分表: 分表前提:当单表数据量太大,会极大的影响sql的执行性能,这时sql会跑的很慢.当单表到达几百万的时候,性能就会有所下降. ...

  8. 亿级流量网站架构核心技术之“数据库分库分表策略”

    本文节选自<亿级流量网站架构核心技术--跟开涛学搭建高可用高并发系统>一书 张开涛 著 电子工业出版社出版 小编会从留言中选择获赞最多的前五名用户免费送出此书哦!规则见文末. 数据库分库分 ...

  9. 银行背景下分库分表技术选型

    业务持续增长带来的单表数据量过大,必然影响到数据库的读写性能,那到底要不要分库分表呢? 阿里巴巴P3C规范给出一个推荐: [推荐]单表行数超过500万行或者单表容量超过2GB,才推荐进行分库分表. 说 ...

最新文章

  1. Javascript Array对象
  2. python 多级菜单_python多级菜单
  3. Java live template[在此处输入文章标题]
  4. 2022年全球及中国固态电解质(SSE)行业应用现状与十四五投资潜力分析报告
  5. Harbour.Space Scholarship Contest 2021-2022 (open for everyone, rated, Div. 1 + Div. 2)(A - D)
  6. Oracle日期范围
  7. 【ELK123】ElasticSearch+Kibana
  8. BUG类算法研究分析
  9. Windows 7安装Virtual Server 2005 R2 SP1
  10. 6 redis 编译失败_Redis6 Windows 版本编译
  11. python-pip : Depends: python-setuptools (= 0.6c1) 问题
  12. macbook 终端命令怎么使用_Mac终端怎么打开?带你全面了解在macOS中使用终端命令行...
  13. 微信小程序人脸识别java_微信小程序使用face++实现人脸识别登录注册
  14. java 输入输出_java基本输入输出小结
  15. 报表分析工具有哪些?常见开源报表工具和商用报表工具介绍
  16. os.system和os.popen函数的区别
  17. Windows 防火墙日志相关
  18. windows XP无法使用suspend to RAM (s3)功能的解决过程
  19. 计算机中丢失krpt怎么办,计算机中丢失krpt。dll怎么办
  20. c语言菜单 键盘,三、Windows键盘快捷键—处理菜单项

热门文章

  1. ff14拆区后哪个服务器人最多,FF14拆区可以转服吗 拆区期间转服教程
  2. oracle 怎么创建类型,ORACLE—002:Create之创建类型
  3. 如何设置照片的高度没有滚条_基金定投选几只合适,如何设置止盈止损,有没有好的组合推荐?...
  4. mysql导出表_mysql导出表的3种方式
  5. UE4 多线程使用tip
  6. Visual Studio 2005结合Direct 9.0 SDK(Aug2007)时应该注意的事项
  7. 开源应用架构之asterisk
  8. c语言中vector函数大全,vector :: empty()函数,以及C ++ STL中的示例
  9. python中func函数用法_python之4类回调函数的使用方法
  10. linux内核编译及添加系统调用(hdu)_浅谈关于Linux内核write系统调用操作的原子性