Sharding-JDBC 工作流程

Sharding-JDBC 工作流程

一、概述

Sharding-JDBC 的原理总结起来很简单:
SQL 解析 => 执行器优化 => SQL 路由 => SQL 改写 => SQL 执行 => 结果归并。在这里插入图片描述

SQL 解析

SQL 解析主要是词法和语法的解析。Sharding-JDBC1.4.x 之前的版本使用 Druid 作为 SQL 解析器。从 1.5.x 版本开始,Sharding-JDBC 采用完全自研的 SQL 解析引擎。

SQL 路由

在这里插入图片描述
SQL 路由是根据分片规则配置以及解析上下文中的分片条件,将 SQL 定位至真正的数据源。它又分为直接路由(使用 Hint )、简单路由和笛卡尔积路由

SQL 改写

将逻辑表名称改成真实表名称,优化分页查询。

SQL 执行

因为可能链接到多个真实数据源, Sharding -JDBC 将采用多线程并发执行 SQL。

结果归并

数据的组装、分页、排序等等。

二、Sharding-JDBC 实现原理

ShardingJDBC 在执行过程中,主要是三个环节:

  • 第一个是解析配置文件。
  • 第二个是对 SQL 进行解析、路由和改写。
  • 第三个把结果集汇总到一起返回给客户端。

之前讲过说 Sharding-JDBC 是一个增强版的 JDBC 驱动,JDBC 的四大核心对象:DataSource、Connection、Statement(PS)、ResulstSet。

Sharding-JDBC 实现了这四个核心接口,在类名前面加上了 Sharding。ShardingDataSource 、 ShardingConnection 、 ShardingStatement ( PS ) 、ShardingResulstSet。

如果要在 Java 代码操作数据库的过程里面,实现各种各样的逻辑,肯定是要从数据源就开始替换成自己的实现。当然,因为在配置文件里面配置了数据源,启动的时候就创建好了。下面用 核心就是ShardingDataSource 获 取 ShardingConnection 。

MyBatis 源码的查询方法最终会走到SimpleExecutor 的 doQuery()方法,doQuery() 方 法 里 面 调 用 了 prepareStatement() 创建连接 , 通 过ShardingDataSource 返回连接

private Statement prepareStatement(StatementHandler handler, Log statementLog) throws SQLException {
Statement stmt;
Connection connection = getConnection(statementLog);
stmt = handler.prepare(connection, transaction.getTimeout());
handler.parameterize(stmt);
return stmt;
}

它经过以下两个方法,返回了一个 ShardingConnection,

DataSourceUtil.fetchConnection()
Connection con = dataSource.getConnection();

基于这个 ShardingConnection,最终得到一个 ShardingPreparedStatement,

stmt = handler.prepare(connection, transaction.getTimeout());

然后就是SQL执行return handler.query(stmt, resultHandler);

public <E> List<E> query(Statement statement, ResultHandler resultHandler) throws SQLException {
PreparedStatement ps = (PreparedStatement) statement;
ps.execute();
return resultSetHandler.handleResultSets(ps);
}

最终调用的是 ShardingPreparedStatement 的 execute 方法。

public boolean execute() throws SQLException {
try {
clearPrevious();
prepare();
initPreparedStatementExecutor();
return preparedStatementExecutor.execute();
} finally {
refreshTableMetaData(connection.getShardingContext(), routeResult.getSqlStatement());
clearBatch();
}
}

prepare() 方法中,prepareEngine.prepare 调用

RouteContext routeContext = this.executeRoute(sql, clonedParameters);

执行路由

private RouteContext executeRoute(String sql, List<Object> clonedParameters) {
this.registerRouteDecorator();
return this.route(this.router, sql, clonedParameters);
}

最后到相应的路由执行引擎。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Sharding-JDBC 是一个开源的分库分表中间件,它提供了数据源的动态加载功能。下面是 Sharding-JDBC 数据源加载的流程: 1. 加载配置文件:首先,Sharding-JDBC 会读取配置文件,一般是通过 Spring 或者 Spring Boot 进行配置。配置文件中包含了数据源的相关信息,比如数据源类型、分库分表规则等。 2. 解析配置文件:Sharding-JDBC解析配置文件,将配置信息转换为内部的数据结构,比如解析数据源类型、解析分库分表规则等。 3. 初始化数据源:根据配置文件中的数据源信息,Sharding-JDBC 会初始化对应的数据源,如读写分离数据源、分布式数据源等。这里会根据配置的数据源类型进行相应的初始化操作。 4. 初始化分库分表规则:根据配置文件中的分库分表规则,Sharding-JDBC 会初始化对应的分库分表规则。这些规则定义了数据如何划分到不同的库表中。 5. 加载数据源路由:Sharding-JDBC 会根据分库分表规则和数据源信息,构建数据源路由对象。数据源路由对象负责将 SQL 解析为对应的数据源和表。 6. 加载 SQL 解析器:Sharding-JDBC 会加载 SQL 解析器,用于解析 SQL 并生成对应的执行计划。 7. 加载执行引擎:Sharding-JDBC 会加载执行引擎,用于执行 SQL 执行计划,并将结果返回给应用程序。 通过以上步骤,Sharding-JDBC 完成了数据源的加载,应用程序可以通过 Sharding-JDBC 进行数据的访问和操作。需要注意的是,具体的加载流程可能会根据不同的版本和配置有所差异,上述流程仅为一般情况下的示意。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值