Seata-AT模式数据源代理-JDBC中的关键知识点
yuyutoo 2024-10-12 00:48 5 浏览 0 评论
背景
Seata 对业务无侵入是通过数据源代理实现的,从下图中可看出,数据源代理的实现涉及到 DataSource、Connection 以及 Statement,这几个关键知识属于 JDBC 的范畴,所以本篇从 JDBC 的视角对他们进行介绍。
一、JDBC 概述
JDBC 代表 Java 数据库连接。JDBC 是一种 Java API,用于连接数据库并执行查询。它是 JavaSE(Java 标准版)的一部分。JDBC API 使用 JDBC 驱动程序连接数据库。
在 JDBC 之前,ODBC API 是连接数据库并执行查询的数据库 API。但是,ODBC API 使用用 C 语言编写的 ODBC 驱动程序(即依赖于平台且不安全)。这就是为什么 Java 定义了自己的 API (JDBC API),它使用 JDBC 驱动程序(用 Java 语言编写)。当前的 JDBC 基于 X/Open SQL 调用级别接口。java.sql包包含 JDBC API 的类和接口。下面给出了 JDBC API 的流行接口列表:
- Driver interface
- Connection interface
- Statement interface
- PreparedStatement interface
- CallableStatement interface
- ResultSet interface
- ResultSetMetaData interface
- DatabaseMetaData interface
- RowSet interface
我们可以使用 JDBC API 来使用 Java 程序处理数据库,使用 JDBC 操作数据源大致需要以下几个步骤:
- 与数据源建立连接。
- 执行 SQL 语句,检索 SQL 执行结果
- 关闭连接。
二、与数据源建立链接
Connection 是 JDBC 对数据源连接的抽象,一旦建立了连接,使用 JDBC API 的应用程序就可以对目标数据源执行查询和更新操作。
获取Connection有两种途径
2.1 DriverManager
这是一个在 JDBC 1.0 规范中就已经存在、完全由 JDBC API 实现的驱动管理类。MYSQL5 之前需要Class.forName(“com.mysql.cj.jdbc.Driver”)的方式主动注册驱动。MYSQL5 之后的驱动包可以省略注册驱动的步骤,会自动加载 jar 包中 META-INF/services/java.sql.Driver 文件中的 JDBC 驱动类。通过getConnection获取数据库连接,如下:
Connection conn = DriverManager.getConnection(url,username,password);
复制代码
2.2 DataSource:
DataSource 接口是 JDBC 2.0 API 中的新增内容,它提供了连接到数据源的另一种方法。使用 DataSource 对象是连接到数据源的首选方法。需要注意 JDBC API 中只提供了 DataSource 接口,DataSource 具体的实现由 JDBC 驱动程序提供。JDBC API 中定义了两个 DataSource 接口比较重要的扩展,用于支撑企业级应用。这两个接口分别为:
- ConnectionPoolDataSource * 支持缓存和复用Connection对象,主流的数据库连接池也提供了DataSource接口的具体实现,如Druid提供了 DruidDataSource,生产中我们会使用数据库连接池所提供的池化的Connection。连接池通过对连接的复用,而不是每次需要操作数据源时都新建一个物理连接来显著地提高程序的效率,这样能够在很大程度上提升应用性能和伸缩性
- XADataSource * 该实例返回的 Connection 对象能够支持分布式事务;如 Druid 中会提供DruidXADataSource。XAConnection 接口继承了 PooledConnection 接口,因此它具有所有 PooledConnection 的特性
三、执行 sql、检索结果
3.1 创建Statement
获取到 JDBC 中的Connection对象之后,我们可以通过Connection对象设置事务属性,并且可以通过Connection接口中提供的方法创建Statement、PreparedStatement或者CallableStatement对象。如:
java.sql.Connection#createStatement()
复制代码
PreparedStatement和CallableStatement是Statement的子接口,Statement接口中定义了执行SQL语句的方法,但这些方法不支持参数输入。
- PreparedStatement
- 接口继承自Statement接口,增加了参数占位符功能,当执行SQL语句时,可使用“?”作为参数占位符,然后使用其提供的其他方法为占位符设置参数值。其实例对象包含已编译的 SQL 语句,由于已预编译过,所以其执行速度要快于 Statement 对象。因此,多次执行的 SQL 语句经常创建为 PreparedStatement 对象,以提高效率。(这里挖个坑,因为其参数设置机制,在实践中也可能会遇到其带来的问题)
- CallableStatement
- 接口继承自PreparedStatement接口,在PreparedStatement的基础上增加了调用存储过程并检索调用结果的功能。
3.2 执行 sql
Statement接口可以理解为 JDBC API 中提供的 SQL 语句的执行器,我们调用Statement接口中定义的不同方法以实现不同的结果:
- 调用 executeQuery()方法执行查询操作
- 调用 executeUpdate()方法执行更新操作
- 调用 executeBatch()方法执行批量处理
3.3 获取结果
对结果的处理则:
- 通过 getResultSet()方法来获取查询结果集,ResultSet 对象代表查询操作的结果集
- 通过 ResultSet 对象的 getMetaData()方法获取结果集元数据信息,该方法返回一个 ResultSetMetaData 对象,我们可以通过 ResultSetMetaData 对象获取结果集中所有的字段名称、字段数量、字段数据类型等信息
- 通过 getUpdateCount()方法来获取更新操作影响的行数
3.4 Connection、Statement、ResultSet 之间的关系
四 关闭 Connection 对象
当使用完 Connection 对象后,需要显式地关闭该对象。Connection 中的 close()方法用于关闭 Connection 对象,由该 Connection 对象创建的所有 Statement 对象也都会被关闭。连接池的实现的 close()方法中会把 Connection 回收到连接池中。
五、最后说一句
我是石页兄,如果这篇文章对您有帮助,或者有所启发的话,欢迎关注笔者的微信公众号【 架构染色 】进行交流和学习。您的支持是我坚持写作最大的动力
相关推荐
- 网站建设:从新手到高手
-
现代化网站应用领域非常广泛,从个人形象网站展示、企业商业网站运作、到政府公益等服务网站,各行各业都需要网站建设。大体上可以归结四类:宣传型网站设计、产品型网站制作、电子商务型网站建设、定制型功能网站开...
- JetBrains 推出全新 AI 编程工具 Junie,助力高效开发
-
JetBrains宣布推出名为Junie的全新AI编程工具。这款工具不仅能执行简单的代码生成与检查任务,还能应对编写测试、验证结果等复杂项目,为开发者提供全方位支持。根据SWEBench...
- AI也能写代码!代码生成、代码补全、注释生成、代码翻译轻松搞定
-
清华GLM技术团队打造的多语言代码生成模型CodeGeeX近期更新了新的开源版本「CodeGeeX2-6B」。CodeGeeX2是多语言代码生成模型CodeGeeX的第二代模型,不同于一代CodeG...
- 一键生成前后端代码,一个36k星的企业级低代码平台
-
「企业级低代码平台」前后端分离架构SpringBoot2.x,SpringCloud,AntDesign&Vue,Mybatis,Shiro,JWT。强大的代码生成器让前后端代码一键生成,无需写任...
- Gitee 代码托管实战指南:5 步完成本地项目云端同步(附避坑要点)
-
核心流程拆解:远程仓库的搭建登录Gitee官网(注册账号比较简单,大家自行操作),点击“新建仓库”,建议勾选“初始化仓库”和“设置模板文件”(如.gitignore),避免上传临时文件。...
- jeecg-boot 源码项目-强烈推荐使用
-
JEECGBOOT低代码开发平台...
- JetBrains推出全新AI编程工具Junie,强调以开发者为中心
-
IT之家2月1日消息,JetBrains发文,宣布推出一款名为Junie的全新AI编程工具,官方声称这款AI工具既能执行简单的代码生成与检查等基础任务,也能应对“编写测试、验证结...
- JetBrains旗下WebStorm和Rider现已加入“非商用免费”阵营
-
IT之家10月25日消息,软件开发商JetBrains今日宣布,旗下WebStorm(JavaScript开发工具)和Rider(.NET开发工具)现已加入“非商用免费”阵营。如果...
- 谈谈websocket跨域
-
了解websocketwebsocket是HTML5的新特性,在客户端和服务端提供了一个基于TCP连接的双向通道。...
- websocket调试工具
-
...
- 利用webSocket实现消息的实时推送
-
1.什么是webSocketwebSocket实现实现推送消息WebSocket是HTML5开始提供的一种在单个TCP连接上进行全双工通讯的协议。以前的推送技术使用Ajax轮询,浏览器需...
- 为 Go 开发的 WebSocket 库
-
#记录我的2024#...
- 「Java基础」Springboot+Websocket的实现后端数据实时推送
-
这篇文章主要就是实现这个功能,只演示一个基本的案例。使用的是websocket技术。...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)