postgresSQL Extended Query执行过程和sharding-proxy的处理
pg Extended Query
PostgreSQL: Documentation: 15: 55.2. Message Flow
多个阶段,可复用
Parse → DESCRIBE statement → SYNC
- Parse 解析, 将 sql 文本字符串,解析成 named preparedStatement 语句(生命周期随session) 占位符和参数类型
- Describe 获取元数据,返回 pst 参数描述符 parameterDescription 和 结果集的行描述符 RowDescription
由于此时 还没执行 Bind,还未将语句传输到backend 执行,RowDescription中列的传输格式 codec format 还是0 ; 参数的类型应该也只是根据客户端传到 frontend 指定的类型来的? - Sync 发完一串 extended messages 后需要发一个 sync 表示结束, 服务端一起处理;
针对 sync 消息,服务端返回是否在事务中执行的状态 ‘T’ 在事务内, ‘I’ 不在事务内
BIND → DESCRIBE portal → EXECUTE → SYNC
a bind step, which creates a portal given a prepared statement and values for any needed parameters; and an execute step that runs a portal's query
- bind 绑定阶段 创建好一个可执行的 portal, 包括参数元数据、返回结果集的元数据 (row 字段的pg类型 typeOid, 类型长度、 传输方式 0-text, 1-binary 等) 参数值
- DESCRIBE portal;此时是发到 backend 来获取元数据的,入参和查询结果的元数据 才是真实的
- execute 阶段 执行并获取结果集, 客户端可以根据上一步 describe portal 拿到的 rowDescription 中列的 format 来决定是用 0-text 还是 1-binary 要求服务端对参数和查询结果集中的字段值进行 format 后传输
同一个session里边,步骤一执行过后 如果是 named portal ,后续就可以直接执行步骤二
步骤一执行完后, frontend session 缓存好命名 pst, 下次同一个session再执行就能直接 走步骤二就可以了
sharding-proxy 执行日志
步骤一
‘P’ Parse stmtcache_1 sql
‘D’ ‘S’ Describe preparedStatement
[DEBUG] 2023-04-07 17:16:53.166 [nioEventLoopGroup-3-3] o.a.s.db.protocol.codec.PacketCodec - Read from client a3f6d846 :
+-------------------------------------------------+
| 0 1 2 3 4 5 6 7 8 9 a b c d e f |
+--------+-------------------------------------------------+----------------+
|00000000| 50 00 00 00 aa 73 74 6d 74 63 61 63 68 65 5f 31 |**P**....stmtcache_1|
|00000010| 00 53 45 4c 45 43 54 20 22 69 64 22 2c 22 73 74 |.SELECT "id","st|
|00000020| 75 64 65 6e 74 5f 6e 61 6d 65 22 20 46 52 4f 4d |udent_name" FROM|
|00000030| 20 22 74 5f 73 74 75 64 65 6e 74 5f 69 6e 66 6f | "t_student_info|
|00000040| 22 20 57 48 45 52 45 20 22 74 5f 73 74 75 64 65 |" WHERE "t_stude|
|00000050| 6e 74 5f 69 6e 66 6f 22 2e 22 69 64 22 20 3d 20 |nt_info"."id" = |
|00000060| 24 31 20 41 4e 44 20 22 74 5f 73 74 75 64 65 6e |$1 AND "t_studen|
|00000070| 74 5f 69 6e 66 6f 22 2e 22 69 64 22 20 3d 20 24 |t_info"."id" = $|
|00000080| 32 20 4f 52 44 45 52 20 42 59 20 22 74 5f 73 74 |2 ORDER BY "t_st|
|00000090| 75 64 65 6e 74 5f 69 6e 66 6f 22 2e 22 69 64 22 |udent_info"."id"|
|000000a0| 20 4c 49 4d 49 54 20 31 00 00 00 44 00 00 00 11 | LIMIT 1...**D**....|
|000000b0| 53 73 74 6d 74 63 61 63 68 65 5f 31 00 53 00 00 |**S**stmtcache_1.**S**..|
|000000c0| 00 04 |.. |
+--------+-------------------------------------------------+----------------+
请求报文 解析成对应的 packet 对象 xxPacket,并创建对应的执行器 xxExecutor

执行结果

此时 rowDescription, dataFormat都是0
步骤二
‘B’ Bind
‘D’ + ‘P’ Describe porta
‘E’ Execute
‘S’ Sync
[DEBUG] 2023-04-07 17:16:53.304 [nioEventLoopGroup-3-3] o.a.s.db.protocol.codec.PacketCodec - Read from client a3f6d846 :
+-------------------------------------------------+
| 0 1 2 3 4 5 6 7 8 9 a b c d e f |
+--------+-------------------------------------------------+----------------+
|00000000| 42 00 00 00 37 00 73 74 6d 74 63 61 63 68 65 5f |**B**...7.stmtcache_|
|00000010| 31 00 00 02 00 01 00 01 00 02 00 00 00 08 00 00 |1...............|
|00000020| 00 00 00 00 00 16 00 00 00 08 00 00 00 00 00 00 |................|
|00000030| 00 16 00 02 00 01 00 00 44 00 00 00 06 50 00 45 |........**D**....P.**E**|
|00000040| 00 00 00 09 00 00 00 00 00 53 00 00 00 04 |.........**S**.... |
报文解析,和对应执行器构建

响应报文

RowDescription 响应结果集的行描述符,DataRowPacket 响应行数据
列 id ,值是 binary 格式 对应 columnDescription 的 dataFormat = 1 (binary)
postgresSQL Extended Query执行过程和sharding-proxy的处理的更多相关文章
- 反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) C#中缓存的使用 C#操作redis WPF 控件库——可拖动选项卡的TabControl 【Bootstrap系列】详解Bootstrap-table AutoFac event 和delegate的分别 常见的异步方式async 和 await C# Task用法 c#源码的执行过程
反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) 背景介绍: 为了平衡社区成员的贡献和索取,一起帮引入了帮帮币.当用户积分(帮帮点)达到一定数额之后,就会“掉落”一定数量的“帮帮 ...
- (转)logback 打印Mybitis中的sql执行过程
场景:在程序开发过程中经常需要跟踪程序中sql语句的执行过程,在控制台打印出sql语句和对应的参数传递就能够更快的定位错误! 原文出处:http://www.cnblogs.com/beiyeren/ ...
- MyBatis 源码分析 - SQL 的执行过程
* 本文速览 本篇文章较为详细的介绍了 MyBatis 执行 SQL 的过程.该过程本身比较复杂,牵涉到的技术点比较多.包括但不限于 Mapper 接口代理类的生成.接口方法的解析.SQL 语句的解析 ...
- Mybatis拦截器执行过程解析
上一篇文章 Mybatis拦截器之数据加密解密 介绍了 Mybatis 拦截器的简单使用,这篇文章将透彻的分析 Mybatis 是怎样发现拦截器以及调用拦截器的 intercept 方法的 小伙伴先按 ...
- 精尽MyBatis源码分析 - SQL执行过程(四)之延迟加载
该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...
- saiku执行过程代码跟踪
使用了很久的saiku,决定跟踪一下代码,看看它的执行核心过程: 一.入口controller代码 1.1.页面打开之后,会发送一个ajax请求 Request URL: http://l-tdata ...
- MySQL执行计划显示与执行过程不符合一例
一 建表和现象的过程如下 CREATE TABLE t1 (id1 INT, a1 INT, b1 INT, PRIMARY KEY(id1));CREATE TABLE t3 (id3 INT UN ...
- 四、Struts2的执行过程和原理
执行过程和原理(可能面试题) 学习目标:熟知struts2的执行过程(下图记住).源码可以不看 a.过滤器的初始化 .StrutsPrepareAndExecuteFilter是一个过滤器,过滤器就有 ...
- MySQL查询语句执行过程及性能优化(JOIN/ORDER BY)-图
http://blog.csdn.net/iefreer/article/details/12622097 MySQL查询语句执行过程及性能优化-查询过程及优化方法(JOIN/ORDER BY) 标签 ...
- IIS 内部运行机制及Asp.Net执行过程详解
一直以来对一个Asp.net页面穿过IIS后就返回给浏览器一个HTML页面感觉很是神奇.虽然做技术这么长时间了,也曾经大致了解过一点来龙去脉,但是如果你真的问起我比较详细的过程,我还真的回答不上来,好 ...
随机推荐
- 为什么你需要升级 pip
更新软件版本可以修复bug,增加新功能和提升性能.例如,NumPy 1.20 添加了类型注释,并在可能的情况下通过使用SIMD来提高性能.如果您要安装NumPy,则可能要安装最新版本. 相反,如果您使 ...
- 配置Nginx 反向代理 + go在windows 环境下编译运行在linux的文件
在源码根目录下 创建build.bat: set GOOS=linux set GOARCH=amd64 go build -o build/myweb main.go 在终端执行: ./build. ...
- java_web----1
一.HTML 1.网页的构成 结构:HTML 超文本标记语言 标签语言 标签写法: <标签名> </标签名> <标签名/> 表现:CSS 行为:JavaScrip ...
- ABAP开发面向对象---类
今日学习ABAP面向对象里面的类,关于构造,继承,实现. 踩坑点:类有抽象的方法,类本身也需要是抽象的,故需要在类申明里面加上ABSTRACT关键字 学习资料为B站翱翔云天老师的 1 CLASS zc ...
- web后端之表单传值
第一种 第二种 第三种陪置web.xml文件
- Spring Boot中编写单元测试
编写单元测试可以帮助开发人员编写高质量的代码,提升代码质量,减少Bug,便于重构.Spring Boot提供了一些实用程序和注解,用来帮助我们测试应用程序,在Spring Boot中开启单元测试只需引 ...
- 2003031126-石升福-python数据分析第四周作业-第二次作业
项目 matplotlib 博客名称 2003031126-石升福-Python数据分析第四周作业 班级链接 20级数据班 作业链接 第二次作业 要求 每道题要有题目,代码(使用插入代码,不会插入代码 ...
- MySQL查询和事务
数据库关联查询 内连接查询(inner join) SELECT * FROM tb1 INNER JOIN tb2 ON 条件 左表查询(左关联查询)(left join) 查询两个表共有的数据,和 ...
- 关于JSP无法使用静态引用的问题案例
问题描述: 在写项目时,对于头部信息,尾部信息,分页信息等出现频率高,又很雷同的部分进行抽取时,使用到了jsp的静态引用功能,但之前我每次使用,都会导致程序报错,甚至出现tomcat无法正常启动的情况 ...
- maven使用junit测试报class not found
突然就找不到类,查了一下是因为使用了Clean的命令,把编译好的class文件清理掉了,在Maven中使用test进行测试就可以了