sharding-jdbc源码分析
深入理解sharding-jdbc的核心实现原理
sharedCode
拥有6年开发经验,目前担任某公司的架构师岗位。
展开
-
sharding-jdbc系列之 数据源配置(一)
spring boot Yaml方式@Bean(name="testDataSource")publicDataSourcetestDataSource()throwsIOException{Stringyml="jdbc/testDataSource.yaml";ResourcecertResource=newClassPa...原创 2018-07-31 12:09:21 · 15498 阅读 · 5 评论 -
sharding-jdbc系列之SQL解析(二)
前言再讲SQL路由之前,先简要的将一个SQL解析,SQL解析是sharding-jdbc非常底层的东西,了解这个,对于真正用这个中间件的作用相对来说稍微弱一点,但是也要了解一个大概。ParsingSQLRouter在SQL路由之前,都会调用该类的parse方法,进行SQL解析publicfinalclassParsingSQLRouterimplementsSQLR...原创 2018-08-01 10:26:39 · 1377 阅读 · 0 评论 -
sharding-jdbc系列之SQL路由(三)
前言本文基于sharding-jdbc1.5.4 , mybatis1.3.0代码入口源码入口: com.dangdang.ddframe.rdb.sharding.jdbc.core.statement.ShardingPreparedStatement该类实现了PreparedStatement接口 。在mybatis执行SQL的时候,会调用PreparedStatemen...原创 2018-08-02 10:13:20 · 1810 阅读 · 0 评论 -
sharding-jdbc系列之分片算法(四)
前言通过前文,我们可以知道,不管是简单路由还是复杂路由,最终都是通过SQL计算出最小执行单元,也就计算该SQL涉及到哪些数据源,哪些表。 在计算这个的时候,都会用到通过ShardingStrategy这个类来处理。今天主要就是讲这个类。ShardingStrategy这个类都会通过当前的分表规则获取。代码片段如下:分库privateCollection&l...原创 2018-08-06 10:10:56 · 4117 阅读 · 0 评论 -
sharding-jdbc系列之SQL改写(五)
前文回顾在SQL路由那一节,我们分析了SQL的路由过程,最终会根据路由算法,计算出来这个SQL最终会经过几个数据源,几张表。以查询为例:select*fromt_user总共两个库,每个库两张表,routeDataSources : 得到两个数据源,dataSource0 , dataSource1routeTables : 以上两个数据源分别得到t_us...原创 2018-08-07 10:15:53 · 1885 阅读 · 0 评论 -
sharding-jdbc系列之SQL执行(六)
前言在前面我们介绍,通过SQL路由找到具体的执行表,通过SQL改写生成具体的执行SQL, 拿到具体的结果之后,sharding-jdbc下一步是干嘛呢,下一步当然是SQL执行了。route代码入口: com.dangdang.ddframe.rdb.sharding.jdbc.core.statement.ShardingPreparedStatementprivate...原创 2018-08-08 10:18:51 · 1643 阅读 · 0 评论 -
sharding-jdbc系列之结果归并(七)
结果获取@OverridepublicResultSetgetResultSet()throwsSQLException{//当前的执行结果不为空,则直接返回if(null!=currentResultSet){returncurrentResultSet;}...原创 2018-08-09 10:08:56 · 1245 阅读 · 0 评论 -
sharding-jdbc系列之order by结果归并(八)
上一节已经介绍了,在上面情况下,sharding-jdbc会选用上面结果合并器,今天介绍的是order by排序结果合并publicOrderByStreamResultSetMerger(finalList<ResultSet>resultSets,finalList<OrderItem>orderByItems)throwsSQLExcept...原创 2018-08-10 10:16:39 · 3355 阅读 · 0 评论 -
sharding-jdbc系列之分页结果归并(九)
MergeEnginepublicResultSetMergermerge()throwsSQLException{//设置列的坐标信息selectStatement.setIndexForItems(columnLabelIndexMap);//调用build()方法,build方法就是根据SQL条件,选择不...原创 2018-08-13 10:36:20 · 7555 阅读 · 0 评论 -
sharding-jdbc系列之强制路由(十)
前言sharding-jdbc允许我们在程序运行过程中,强制设置某一次SQL的路由规则、强制路由数据库代码解读privateCollection<String>routeDataSources(finalTableRuletableRule){//获取分库策略DatabaseShardingStrategys...原创 2018-08-14 13:37:15 · 7116 阅读 · 0 评论 -
sharding-jdbc系列之分布式ID(十一)
sharding-jdbc系列之分布式ID(十一)背景在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识。如在美团点评的金融、支付、餐饮、酒店、猫眼电影等产品的系统中,数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据或消息,数据库的自增ID显然不能满足需求;特别一点的如订单、骑手、优惠券也都需要有唯一ID做标识。此时一个能够生成全局唯一ID的系统是非常必要的。概括下来...原创 2018-08-15 15:43:04 · 3028 阅读 · 0 评论 -
sharding-jdbc系列之按月动态分表(十二)
前言sharding-jdbc默认是不支持在程序的运行过程中动态的创建表的,如果需要做到动态的按月分表,所有的表需要提前创建好哦, 比如,你可以把这两年的表全部建立好。或者另外写个程序,专门用来创建表,具体怎么做,你们自己选择,本文主要是讲,如果通过sharding-jdbc实现按月动态分表。代码实现设置数据源的时候,给该表设置分表规则java代码@Beanp...原创 2018-08-15 15:43:57 · 21319 阅读 · 44 评论 -
sharding-jdbc系列之柔性事物(十三)
这张图是从官网上下载下来的,说明:对于sql的执行,在执行前记录日志,如果执行成功,把日志删除,如果执行失败,重试一定次数(如果未达到最大尝试次数便执行成功了,一样删除日志)。 异步任务不断扫描执行日志,如果重试次数未达到最大上限,尝试重新执行,如果执行成功,删除日志。从上面两点分析可以看出,由于采用的是重试的模式,也就是说同一条语句,是有可能被多次执行的,所以官方提到了柔性...原创 2018-08-17 12:08:25 · 1585 阅读 · 0 评论 -
sharding-jdbc系列之常见问题(十四)
1.sharding-jdbc是否支持批量插入1.5.4之前应该是不支持,批量插入在SQL进行词法解析的时候会报错,目前是无法完成SQL解析的。后续的版本都可以完美支持2.Sharding-JDBC 适用于哪些场景,不适用于哪些场景?是否有性能评估?对于关系型数据库数据量很大的情况,需要进行水平拆库和拆表,这种场景很适合使用 Sharding-JDBC。举例说明:假设有一亿数...原创 2018-08-17 12:09:55 · 10396 阅读 · 1 评论 -
spingboot整合sharding-sphere4.0.0.RC2分库分表
pom文件<dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId> <version>4.0.0-RC2</versio...原创 2019-09-19 14:38:50 · 4227 阅读 · 1 评论