PGjdbc源码试读(二)

news/2025/1/18 16:03:57/文章来源:https://www.cnblogs.com/bbban/p/18338340

本期目标

追踪

Connection.createStatement()
Statement.executeUpdate(String sql)

追踪

Connection.createStatement()

在PgConnection中找到createStatement()方法:

该方法调用了同名方法,并传递了两个参数,查询两个常量的注释:


TYPE_FORWARD_ONLY 表示返回的集合ResultSet只能顺序正向遍历。
CONCUR_READ_ONLY 表示返回的集合ResultSet只可以读取其中的数据,不允许修改集合中的数据。

继续追踪到:

该方法首先调用isClosed()方法检查连接是否被close,在连接正常情况下才会继续执行,否则会throw exception。
继而再次调用新的同名方法,传递了三个参数,增加的参数通过getHoldability()方法获得,该方法如下:

我们发现该方法实际上返回了PgConnection的一个属性,该属性:

即传递的第三个参数实际上等价于:ResultSet.CLOSE_CURSORS_AT_COMMIT,参考注释如下:

因而三个参数实际上为:

TYPE_FORWARD_ONLY 表示返回的集合ResultSet只能顺序正向遍历。
CONCUR_READ_ONLY 表示返回的集合ResultSet只可以读取其中的数据,不允许修改集合中的数据。
CLOSE_CURSORS_AT_COMMIT 表示表示修改提交时当前ResultSet结果集关闭

继续追踪至:

我们发现其调用了PgStatement的构造函数,传递了之前三个参数,并将当前连接作为一个新的参数传递。
追踪该构造函数:

Statement.executeUpdate(String sql)

在PGStatement中找到该方法:

该方法核心部分调用了三个方法,对其依次进行追踪:

executeWithFlags(sql, QueryExecutor.QUERY_NO_RESULTS)

QUERY_NO_RESULTS:这个常量用于标记查询执行时的一个特定标志,表明执行该查询时并不期望返回结果集。
结构如下:

其调用了executeCachedSql方法,并传递了三个参数,新增的参数为:

推测该参数应该用于标识无返回列的情况。

继续向下追踪:

preferQueryMode(String) 默认值:extended 意义:指定使用哪种模式对数据库执行查询:

simple 表示(‘Q’ execute,无解析,无绑定,仅文本模式),
extended 表示始终使用绑定/执行消息,
extendedForPrepared 表示仅针对准备好的语句进行扩展,
extendedCacheEverything 表示使用extended协议并尝试将每个语句(包括Statement.execute(String sql))缓存在查询缓存中。

查询键的主要作用是为特定的SQL查询或命令生成一个唯一的标识符,这个标识符用于在缓存中查找、存储或验证查询的结果。当应用程序执行一个查询时,查询缓存机制(如果启用了的话)会首先检查是否已经为相同的查询(即具有相同查询键的查询)缓存了结果。如果是,就可以直接返回缓存中的结果,而无需再次执行实际的数据库查询,从而节省时间和资源。

最后的查询过程在

  res = executeWithFlags(cachedQuery, flags)

处实现,未详述。
executeCachedSql(String sql, int flags,String @Nullable [] columnNames) 方法关联要素较多,除少数注释外,将单独记录,此处不再详述。

checkNoResultUpdate()

该方法检查上一步调用的executeWithFlags方法是否正常执行,按照逻辑,其不会产生查询结果,若其产生了,则throw Exception,指示有异常产生。
需要注意的是,PgStatement类中查询方法的查询结果是保存在result属性中的,不会在直接查询的方法直接return,故该检查即为检查result是否为空。

getUpdateCount()

返回最近一次执行executeUpdate方法时影响的行数,未细究

debug

在之前追踪到的几个关键函数部分打上断点,调试运行。

如上图所示,传递空数组,其起到标识作用


preferQueryMode实际就是这个queryExecutor对象的preferQueryMode属性

总结

  • Connection.createStatement(),无传递参数,其将以一系列事先约定好的默认值取作为PgStatement的构造方法参数,以此构造出一个PgStatement对象。用到的默认值如下:

TYPE_FORWARD_ONLY 表示返回的集合ResultSet只能顺序正向遍历。
CONCUR_READ_ONLY 表示返回的集合ResultSet只可以读取其中的数据,不允许修改集合中的数据。
CLOSE_CURSORS_AT_COMMIT 表示表示修改提交时当前ResultSet结果集关闭

  • Statement.executeUpdate(String sql),该方法调的最底层execute方法的执行流程实际上应该是有一定标准的,而逐级调用的过程,实际上就是在给其增加默认配置,使其能按标准执行的过程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/776564.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

四川省职工职业技能大赛网络安全决赛WP

上午CTF部分 web simplelogin yakit爆破出密码,记得应该是a123456: ppopp index.php有一个任意文件读取: <?php //upload.php error_reporting(0); highlight_file(__FILE__); class A {public $a;public function __destruct(){$s=$this->$a;$s();} } class B{publi…

硬件开发笔记(二十九):TPS54331电源设计(二):12V转3.3V和12V转4V原理图设计

前言电源供电电路设计很重要,为了更好的给对硬件设计有需求的人,特意将电源设计的基础过程描述出来。  紧接前一篇12V转5V的,本篇设计常用的12V转3.3V电路,不常用的12V转4V电路。 12V转3.3V电路步骤一:应用典型电路(依据底板和典型电路得差别,电感和电容在3.3~5V范围内…

深入浅出:可视化理解揭示决策树与梯度提升背后的数学原理

决策树是一种非参数的监督学习算法,可用于分类和回归。它使用类似树的结构来表示决策及其潜在结果。决策树易于理解和解释,并且可以轻松地进行可视化。但是当决策树模型变得过于复杂时,它不能很好地从训练数据中泛化,会导致过拟合。 梯度提升是一种集成学习模型,在其中结合…

ComfyUI插件:ComfyUI layer style 节点(二)

前言: 学习ComfyUI是一场持久战,而ComfyUI layer style 是一组专为图片设计制作且集成了Photoshop功能的强大节点。该节点几乎将PhotoShop的全部功能迁移到ComfyUI,诸如提供仿照Adobe Photoshop的图层样式、提供调整颜色功能(亮度、饱和度、对比度等)、提供Mask辅助工具、…

GitHub Star 数量前 15 的开源低代码项目

发现 GitHub 上最受欢迎的开源低代码项目。上周,我们发布了文章《GitHub Star 数量前 12 的开源无代码工具》,收获了许多喜爱。许多朋友留言问,为什么 n8n、Appsmith 等熟知的产品没有上榜?原因是我们是根据 GitHub 上的 "no-code" 标签来制作这份名单的,而这两…

CSS mask-image 实现边缘淡出过渡效果

CSS mask-image 实现边缘淡出过渡效果,关键是淡出,而非降低透明度。使用场景 在生产环境中,遇到一个需求,需要在一个深色风格的大屏页面中,嵌入 Google Maps。为了减少违和感,希望地图四边能够淡出过渡。 这里的“淡出过渡”,关键是淡出,而非降低透明度。 基于 Google …

达梦数据库查看版本

傻逼达梦在达梦命令界面执行命令select * from v$version;可以查看达梦当前版本号 还有一条命令可以查看更详细的信息select * from v$instance; 如下

NewStarCTF WEEK4|WEB PharOne

首先进入后查看源码进入class.php看见unlike很明显是一个phar反序列化的利用 我们有两种选择 一 一句话木马 <?php class Flag{public $cmd; }$a=new Flag(); $a->cmd="echo \"<?=@eval(\\\$_POST[a]);\">/var/www/html/1.php"; $phar = new…

没有显示屏也能远程控制?ToDesk的虚拟屏做到了!

如果你习惯多屏办公,但远程控制时受控电脑却只有一个屏幕,或者连屏幕都没有怎么办? 如果你想远控家里电脑打游戏,但不想打开显示屏被发现,或是需要远程打开模拟器和visual studio等软件,但苦于没有显示器怕远控不成功? 小社长今天给你安利ToDesk远程控制的虚拟屏功能!只…

Markdown的使用方法

Markdown的使用非常简单。以下是一些基本的Markdown语法,可以帮助你开始使用它来格式化文本。 标题 在文字前面加上#来创建标题。#的数量代表标题的级别。markdown 复制# 一级标题 ## 二级标题 ### 三级标题 #### 四级标题 ##### 五级标题 ###### 六级标题段落与换行 直接输入…

ToDesk标注功能和白板有什么区别?手机可以使用吗?

经常需要远程会议或者远程上课的小伙伴对于白板一定不陌生,它可以提供文档在线演示、编辑、批注等辅助性功能,方便小伙伴在远程会议或上课中进行讲解、展示和教学等。 最近小社长发现ToDesk远程控制软件新出了个标注功能,比单独下个白板软件更方便,而且免费版本就能享受,手…