mysql connector 执行 select 和 shardingshpere-proxy 的处理过程

use java mysql connector

// fake mysql select code
// ... datasource init
Connection conn = datasource.getConnection();
PreparedStatement pst = conn.prepareStatement("select id, task_name from t_task where id = ?");
pst.setLong(1, 31);
pst.executeQuery();

按照直觉, 既然用了 preparedStatement, 执行过一次后会在服务端缓存好预编译的语句, 之后就能省去这个解析过程,直接提交参数执行就好了

  1. 但是, mysql connector 默认创建的是 ClientPreparedStatement
public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) throws SQLException {
        try {
            synchronized(this.getConnectionMutex()) {
                this.checkClosed();
                ClientPreparedStatement pStmt = null;
                boolean canServerPrepare = true;
                String nativeSql = (Boolean)this.processEscapeCodesForPrepStmts.getValue() ? this.nativeSQL(sql) : sql;
                if ((Boolean)this.useServerPrepStmts.getValue() && (Boolean)this.emulateUnsupportedPstmts.getValue()) {
                    canServerPrepare = this.canHandleAsServerPreparedStatement(nativeSql);
                }
              // useServerPrepStmts = false
                if ((Boolean)this.useServerPrepStmts.getValue() && canServerPrepare) {
                      // ... 省略一些代码
                    } else {
                    	//... 省略一些代码
                            pStmt = (ClientPreparedStatement)this.clientPrepareStatement(nativeSql, resultSetType, resultSetConcurrency, false);
                        }
                    }
                } else {
                    pStmt = (ClientPreparedStatement)this.clientPrepareStatement(nativeSql, resultSetType, resultSetConcurrency, false);
                }

                return (PreparedStatement)pStmt;
            }
        } catch (CJException var17) {
            throw SQLExceptionsMapping.translateException(var17, this.getExceptionInterceptor());
        }
    }

因为默认并没有设置 useServerPrepStmts = true, 默认是false 去指定要求服务端缓存 创建的 clientPrepareStatement 客户端语句

  1. 是不是 ClientPreparedStatement 看着客户端侧进行一些元数据的缓存?
    pst.executeQuery(); 代码中有一段逻辑, 如果cacheResultSetMetadata=true的话,会缓存元数据,但是并没有
                  boolean cacheResultSetMetadata = (Boolean)locallyScopedConn.getPropertySet().getBooleanProperty(PropertyKey.cacheResultSetMetadata).getValue();
                    String origSql = ((PreparedQuery)this.query).getOriginalSql();
                    if (cacheResultSetMetadata) {
                        cachedMetadata = locallyScopedConn.getCachedMetaData(origSql);
                    }

所以,虽然每次还是从服务端拿返回 参数 和 resultSet 的一些元数据

  1. 最终发往服务端(这边场景是proxy) 的 sql 其实是非参数化的 com_query 命令
    image

  2. proxy 接收到 com_query 交由 MySQLComQueryPacketExecutor 处理

   public Collection<DatabasePacket<?>> execute() throws SQLException {
        ResponseHeader responseHeader = proxyBackendHandler.execute();
        if (responseHeader instanceof QueryResponseHeader) {
            return processQuery((QueryResponseHeader) responseHeader);
        }
        responseType = ResponseType.UPDATE;
        return processUpdate((UpdateResponseHeader) responseHeader);
    }

MySQLComQueryPacketExecutor 常规文本查询,在 proxy frontend 处理过程较为的简单,直接交给 backend 执行,后续就和 sharding-jdbc 核心处理逻辑一致了,比如 分库分表、读写分离、单库单表直接执行

扩展:

原文链接:https://www.cnblogs.com/mushishi/p/17329876.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:mysql connector 执行 select 和 shardingshpere-proxy 的处理过程 - Python技术站

(0)
上一篇 2023年4月18日
下一篇 2023年4月19日

相关文章

  • Maven基础知识大梳理

    Maven基础知识大梳理 什么是Maven? Maven是一个开源的项目管理工具,用于管理Java项目中的依赖关系、构建过程等。它提供了一个标准的项目结构和一组构建规则,可以让开发人员更加专注于代码本身而不是构建和部署过程。同时,Maven还可以管理项目生命周期,支持丰富的插件机制,可以在构建过程中自动执行测试、生成文档等操作。 Maven的核心概念 POM…

    Java 2023年6月2日
    00
  • jsp自定义标签之ifelse与遍历自定义标签示例

    jsp自定义标签之ifelse与遍历自定义标签示例完整攻略 什么是自定义标签? 自定义标签是一种高级的JSP技术,它可以让JSP页面的开发人员编写出自己的标签,使得标签在JSP页面中的使用更加方便。 自定义标签分类 JSP自定义标签有两种类型:标签库模式(Tag Library)和JavaBean模式(JavaBean)。标签库包括EL函数和标签处理程序两种…

    Java 2023年6月15日
    00
  • 基于Java中的StringTokenizer类详解(推荐)

    下面是关于“基于Java中的StringTokenizer类详解”的完整攻略。 1. 什么是StringTokenizer类? StringTokenizer类是Java中用来分割字符串的类,它的作用类似于split()方法。使用StringTokenizer类可以将一个字符串按照指定的分隔符进行分割,得到一个包含多个子字符串的字符串数组。 2. Strin…

    Java 2023年5月27日
    00
  • Java文件基本操作总结

    下面我将详细讲解Java文件基本操作总结的完整攻略。 概述 Java是一种广泛使用的编程语言。在一个Java程序中,文件是很重要的组成部分,因为它包含了编程人员所书写的代码。在这篇攻略中,我们将介绍Java文件的基本操作。 基本操作 1. 文件的读取 Java文件读取有两种方式:字符流和字节流。其中,字符流主要用于读取文本文件,可以逐个字符读取。而字节流则用…

    Java 2023年5月20日
    00
  • 详解Java的位操作符

    详解Java的位操作符 在Java编程中,位操作符是十分重要的操作符之一。它可以对数字进行位运算,通过改变二进制数的位来实现一些比较复杂的操作。本文将详细讲解Java的位操作符。 按位与(&)操作符 按位与操作符”&”主要用于对二进制数进行与运算。如果两个位都是1,那么结果就是1,否则结果就是0。下面是一个示例: int a = 6; int…

    Java 2023年5月26日
    00
  • Mybatis输入输出映射及动态SQL Review

    Mybatis输入输出映射及动态SQL Review Mybatis是一个基于Java的持久化框架,支持定制化SQL、存储过程以及高级映射。在Mybatis中,输入输出映射是指将Java对象与SQL语句的参数或结果集进行转换的机制,而动态SQL则可根据需要构建不同的SQL语句。 输入输出映射 输入输出映射主要涉及Mybatis中的ParameterHandl…

    Java 2023年5月19日
    00
  • 详解如何使用MyBatis简化JDBC开发

    下面我给您详细讲解如何使用MyBatis简化JDBC开发的完整攻略。 什么是MyBatis? MyBatis是一款优秀的Java持久层框架,可以对JDBC进行封装,使得我们在开发过程中不再需要手动编写JDBC的相关代码,极大地简化了代码编写的难度,并提高了开发效率。 如何使用MyBatis? 添加依赖 使用Maven构建项目时,在pom.xml文件中加入以下…

    Java 2023年5月20日
    00
  • java语言实现权重随机算法完整实例

    Java语言实现权重随机算法完整实例 什么是权重随机算法? 权重随机算法是指按照一定的权重来随机选择一项的算法。举个例子,假设我们有一些商品,每个商品都有一个权重,我们可以按照权重来随机选取一个商品。 实现思路 权重随机算法需要结合随机数和权重来实现。具体而言,我们通过生成一个随机数来决定选取哪个元素,选取的元素对应的权重越高,生成的随机数落在该权重所在的区…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部