Sharding-JDBC的架构以及源码的示例分析
发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,Sharding-JDBC的架构以及源码的示例分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Sharding-jdbc架构Sha
千家信息网最后更新 2025年12月02日Sharding-JDBC的架构以及源码的示例分析
Sharding-JDBC的架构以及源码的示例分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
Sharding-jdbc架构
Sharding-jdbc 系统架构分成5个部分:
SQL解析
SQL路由
SQL改写
SQL执行
结果集归并
下面从上面五个部分来分析Sharding-jdbc
功能模块
SQL解析
SQL路由
SQL路由序列图
调用链
ShardingPreparedStatement.execute
执行方法
org.apache.shardingsphere.shardingjdbc.jdbc.core.statement.ShardingPreparedStatement.execute()
方法源码
@Override public boolean execute() throws SQLException { try { //本地缓存清空 clearPrevious(); /** * 路由 * */ shard(); // 初始化 preparedStatement initPreparedStatementExecutor(); // 执行sql return preparedStatementExecutor.execute(); } finally { clearBatch(); } }BaseShardingEngine.shard
org.apache.shardingsphere.core.BaseShardingEngine.shard(String, List
public SQLRouteResult shard(final String sql, final List
BaseShardingEngine.executeRoute
一些路由相关的hook在这里执行。
org.apache.shardingsphere.core.BaseShardingEngine.executeRoute(String, List)
private SQLRouteResult executeRoute(final String sql, final ListclonedParameters) { routingHook.start(sql); try { SQLRouteResult result = route(sql, clonedParameters); routingHook.finishSuccess(result, metaData.getTables()); return result; // CHECKSTYLE:OFF } catch (final Exception ex) { // CHECKSTYLE:ON routingHook.finishFailure(ex); throw ex; } }
PreparedStatementRoutingEngine.route
org.apache.shardingsphere.core.route.PreparedStatementRoutingEngine.route(List)
public SQLRouteResult route(final Listparameters) { if (null == sqlStatement) { // 解析SQL sqlStatement = shardingRouter.parse(logicSQL, true); } /** * 第一步:根据上面异步解析出来的sqlStatement,结合配置的路由规则,找到对应的物理表表名 * 第二步:这里是主从(读写)路由,根据sql的类型(select、DML)决定走主库还是从库。 */ return masterSlaveRouter.route(shardingRouter.route(logicSQL, parameters, sqlStatement)); }
SQLParseEngine.parse0
org.apache.shardingsphere.core.parse.SQLParseEngine.parse0(String, boolean)
private SQLStatement parse0(final String sql, final boolean useCache) { …… // 创建一个根据数据库匹配的解析引擎,解析sql。比如mysql的sql创建mysql的数据解析引擎。 SQLStatement result = new SQLParseKernel(ParseRuleRegistry.getInstance(), databaseType, sql).parse(); if (useCache) { cache.put(sql, result); } return result; }SQLParseKernel.parse
这个是解析sql。这个方法不再深入了。
org.apache.shardingsphere.core.parse.core.SQLParseKernel.parse()
public SQLStatement parse() { // 解析sql SQLAST ast = parserEngine.parse(); // 抽取sql 片段 Collection sqlSegments = extractorEngine.extract(ast); Map parameterMarkerIndexes = ast.getParameterMarkerIndexes(); return fillerEngine.fill(sqlSegments, parameterMarkerIndexes.size(), ast.getSqlStatementRule()); } ParsingSQLRouter.route ( 重要)
org.apache.shardingsphere.core.route.router.sharding.ParsingSQLRouter.route(String, List, SQLStatement)
public SQLRouteResult route(final String logicSQL, final Listparameters, final SQLStatement sqlStatement) { /** * 根据sql类型,生成不同的优化引擎。比如我这里调试用的是select语句,生成就是ShardingSelectOptimizeEngine 实例。 * 对 语句进行优化 */ ShardingOptimizedStatement shardingStatement = ShardingOptimizeEngineFactory.newInstance(sqlStatement).optimize(shardingRule, metaData.getTables(), logicSQL, parameters, sqlStatement); boolean needMergeShardingValues = isNeedMergeShardingValues(shardingStatement); if (shardingStatement instanceof ShardingConditionOptimizedStatement && needMergeShardingValues) { checkSubqueryShardingValues(shardingStatement, ((ShardingConditionOptimizedStatement) shardingStatement).getShardingConditions()); mergeShardingConditions(((ShardingConditionOptimizedStatement) shardingStatement).getShardingConditions()); } /** * 这里获取一个路由引擎,这里有各种引擎,常见的有 StandardRoutingEngine、ComplexRoutingEngine * 这次获取的就是 获取一个 StandardRoutingEngine 路由引擎。(shardingtable数目为1,或者所有的表都是有绑定关系的) * 接着执行 StandardRoutingEngine.route方法 * */ RoutingResult routingResult = RoutingEngineFactory.newInstance(shardingRule, metaData.getDataSources(), shardingStatement).route(); if (needMergeShardingValues) { Preconditions.checkState(1 == routingResult.getRoutingUnits().size(), "Must have one sharding with subquery."); } // 分布式主键插入 if (shardingStatement instanceof ShardingInsertOptimizedStatement) { setGeneratedValues((ShardingInsertOptimizedStatement) shardingStatement); } // 加密 EncryptOptimizedStatement encryptStatement = EncryptOptimizeEngineFactory.newInstance(sqlStatement) .optimize(shardingRule.getEncryptRule(), metaData.getTables(), logicSQL, parameters, sqlStatement); SQLRouteResult result = new SQLRouteResult(shardingStatement, encryptStatement); result.setRoutingResult(routingResult); return result; }
StandardRoutingEngine.route(重要)
org.apache.shardingsphere.core.route.type.standard.StandardRoutingEngine.route()
public RoutingResult route() { if (isDMLForModify(optimizedStatement.getSQLStatement()) && !optimizedStatement.getTables().isSingleTable()) { throw new ShardingException("Cannot support Multiple-Table for '%s'.", optimizedStatement.getSQLStatement()); } /** * 1、根据逻辑表名去拿分表规则 * 2、根据分表规则 去拿DataNode(key 为 dataSourceName,value 为物理表表名)。 * 3、将上面的 dataNode 封装成 RoutingResult */ return generateRoutingResult(getDataNodes(shardingRule.getTableRule(logicTableName))); }SQL改写
SQL执行
关于Sharding-JDBC的架构以及源码的示例分析问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。
路由
引擎
方法
架构
分析
源码
规则
问题
示例
重要
个部
分表
就是
数据
更多
物理
类型
语句
帮助
生成
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
拆分软件开发
服务器 win10
关于互联网和科技的作文
炫视网络技术有限公司
清远数字软件开发价格走势
北京地区服务器分布图
潍柴动力公司软件开发员工前景
软件开发加班多少一个小时
系统软件开发哪家好
数据结构与测绘软件开发
软件开发质监部门
浙江嵌入式软件开发正规平台
长沙软件开发环境怎么样
无主之地3服务器掉线
网络安全低位领军企业潜伏报告
软件开发管理制度下载
辽阳手机服务器找哪家
软件开发语言是怎么产生的
游戏软件开发应聘书
数模与软件开发有关系吗
安庆oa管理软件开发哪家好
俄罗斯大全数据库
数据库中qts是什么意思
服务器网线插哪个口
ODBC连接到SQL数据库
存储服务器与管理平台
掘泥打击者魔兽数据库
数据库求最高范式
网络技术与软件工程就业方向
网站代理服务器获得软件