每日时讯!mysql connector 执行 select 和 shardingshpere-proxy 的处理过程

2023-04-18 15:58:12 | 来源:博客园


(资料图片)

use java mysql connector

// fake mysql select code// ... datasource initConnection 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 命令

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

public Collection> 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 核心处理逻辑一致了,比如 分库分表、读写分离、单库单表直接执行

扩展:

上一篇 下一篇

相关新闻

每日时讯!mysql connector 执行 select 和 shardingshpere-proxy 的处理过程

厦门今年首批三块商住用地下月起拍

超级阴线炸板次日的处理方式_天天快资讯

焦点短讯!突发!美国外交使团在苏丹遇袭

今日pd999钯金回收价格查询(2023年04月18日)

天津港北港路南延工程二标段打桩作业正式开工

要闻速递:拦截信访“挂号”的种种怪象:销号

全球播报:福特Ka + Active从城市汽车到坚固的城市巡洋舰

​文心一言嵌入百度内部工作平台,全体员工都能使用_环球快讯

出行注意!大雨持续,湖南部分高速交通管制|环球热头条

天弘基金陈国光:乘时代之风,做基本面驱动的科技投资

特斯拉中国工厂薪资曝光:普通工人月薪1万块,还有股票拿

富士康老板郭台铭_郭台铭祖籍-每日观点

上车盘跌价 屯门元朗单日4宗蚀让

微头条丨炸学校歌曲_炸学校

最新新闻

每日时讯!mysql connector 执行 select 和 shardingshpere-proxy 的处理过程

厦门今年首批三块商住用地下月起拍

超级阴线炸板次日的处理方式_天天快资讯

焦点短讯!突发!美国外交使团在苏丹遇袭

今日pd999钯金回收价格查询(2023年04月18日)

天津港北港路南延工程二标段打桩作业正式开工

要闻速递:拦截信访“挂号”的种种怪象:销号

全球播报:福特Ka + Active从城市汽车到坚固的城市巡洋舰

​文心一言嵌入百度内部工作平台,全体员工都能使用_环球快讯

出行注意!大雨持续,湖南部分高速交通管制|环球热头条

天弘基金陈国光:乘时代之风,做基本面驱动的科技投资

特斯拉中国工厂薪资曝光:普通工人月薪1万块,还有股票拿

富士康老板郭台铭_郭台铭祖籍-每日观点

上车盘跌价 屯门元朗单日4宗蚀让

微头条丨炸学校歌曲_炸学校

今日报丨五一档电影你想看哪部?

损坏的图像没有被指定在windows上运行(损坏的图像没有被指定在windows上运行)

维科技术(600152.SH)发2022业绩,净亏损1.05亿元|当前讯息

当日快讯:国家发改委社会司赴上海 青岛开展邮轮旅游专题调研

每日快播:企业所得税年报流程

下花园区推进老旧小区改造惠民

镍&不锈钢: 需求回暖信号提振市场情绪,价格阶段性回调

美联工商铺:港3月商铺注册录101宗 按月升7.4%

快资讯丨hao123_com设为主页

微信:处置1956个小程序,完成139个微短剧小程序主体备案

飞鸟集|捧卷轻吟,手写我心,非典型文学少女詹紫然

潜地弹道导弹_关于潜地弹道导弹介绍|今日热讯

每日简讯:“一河、一山、一网、四片区”构建郑州林业建设新格局

给科尔沁沙地披“绿装” 今日快讯

环球快资讯:社评:巴西总统访华显示南南合作前景广阔