ShardingSphere JDBC 语句执行初探

本文从源码角度探索ShardingSphere JDBC的工作原理,包括如何加载配置的数据库源,以及如何处理SQL语句。通过断点调试,发现ShardingSphere JDBC作为一个内嵌中间件,以logic_db名义介入Mybatis与数据库之间,拦截并处理SQL执行。文章详细跟踪了从SqlSession到PreparedStatement的执行路径,揭示了ShardingSphere JDBC的入口和初步处理路径。
摘要由CSDN通过智能技术生成

简介

在前几篇文中,我们基于源码就ShardingSphere的核心功能给运行了一遍,本篇文章开始,我们开始探索源码,看看ShardingSphere是如何进行工作的

概览

开始之前,我们先思考这次探索的疑点:

  • 1.ShardingSphere是如何加载我们配置的多个数据库源的?
  • 2.ShardingSphere是如何将语句写到不同的数据源的?

带着问题去探索,虽然可能得不到答案,但起码有个方向

基于我们JDBC探索的文章,打上相关的断点,开始我们的探索之旅

源码探索

1.寻找ShardingSphere JDBC 的入口

在下面代码中的init和process打上断点,看看能不能通过程序调用栈找到蛛丝马迹

public final class ExampleExecuteTemplate {
   
    
    public static void run(final ExampleService exampleService) throws SQLException {
   
        try {
   
            exampleService.initEnvironment();
            exampleService.processSuccess();
        } finally {
   
            exampleService.cleanEnvironment();
        }
    }
}

exampleService.initEnvironment() 进来以后,调用栈空空如也,啥也没有,看来我们第一个探索如果加载多个配置的数据源的目的告吹了

但还是继续Debug下去,竟然全是Ibatis相关的东西,没有Debug到ShardingSphere相关的代码,安慰自己,正常现象

继续探索:exampleService.processSuccess(),来到下面的相关语句的插入、查询等相关的操作,在insertData()打上断点

public class OrderServiceImpl implements ExampleService {
   
    @Override
    @Transactional
    public void processSuccess() throws SQLException {
   
        System.out.println("-------------- Process Success Begin ---------------");
        List<Long> orderIds = insertData();
        printData();
        deleteData(orderIds);
        printData();
        System.out.println("-------------- Process Success Finish --------------");
    }
}

基于之前尝试没有收获,这次不得不小心翼翼,跟着函数调用不断的深入下去

MapperProxy.class,执行下面的方法,进行跟下去:

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
   
        try {
   
            if (Object.class.equals(method.getDeclaringClass())) {
   
                return method.invoke(this, args);
            }

            if (this.isDefaultMethod(method)) {
   
                return this.invokeDefaultMethod(proxy, method, args);
            }
        } catch (Throwable var5) {
   
            throw ExceptionUtil.unwrapThrowable(var5);
        }

        MapperMethod mapperMethod = this.cachedMapperMethod(method);
	// 从这里进入
        return mapperMethod.execute(this.sqlSession, args);
    }

来到下面的函数

    public Object execute(SqlSession sqlSession, Object[] args) {
   
        Object result;
        Object param;
        switch(this.command.getType()) {
   
        case INSERT:
            param = this.method.convertArgsToSqlCommandParam(args);
	    // 从这里进入,跟踪insert方法
            result = this.rowCountResult(sqlSession.insert(this.command.getName(), param));
            break;
        case UPDATE:
	......
    }

其中我们看到了熟悉的数据库相关的参数:SqlSession sqlSession,我们调用堆栈,查看其内容,如下图:

image.png

数据库名称竟然是 logic_db,想到秦老师讲课时说ShardingSphere UI中也能用JDBC,只是它的名称是

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值