Sharding-JDBC的架构以及源码的示例分析
发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,Sharding-JDBC的架构以及源码的示例分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Sharding-jdbc架构Sha
千家信息网最后更新 2026年11月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安全错误
数据库的锁怎样保障安全
互联网金融监管科技数据
互联网科技保险
鸠鸠互联网科技
互联网品科技
狮子座互联网科技
奇酷互联网科技
互联网与新科技
万易互联网科技有限公司
朗涯互联网科技
左右互联网络科技
美国互联网前沿科技
中国互联网有什么科技含量
昊天互联网科技有限公司
国大互联网教育科技有限公司工作
本届互联网博览会上的黑科技
互联网方面的科技前沿
黑科技 体验场景 互联网大会
互联网时代科技型公司的机会
容联科技互联网电商
北京军民互联网科技公司
碳银互联网科技有限公司
苏州铭阳互联网科技有限公司
互联网科技人工智能实验室
天津腾达互联网科技有限公司
上海钢联属于互联网科技股吗
广州富喜互联网络科技
兰石爱特工业互联网科技分公司
科技信息时代互联网发展
科技互联网经济论坛
互联网科技创新创业项目