Seata-AT模式数据源代理-JDBC中的关键知识点

news2024/12/24 7:29:29

背景

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接口中提供的方法创建StatementPreparedStatement或者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 回收到连接池中。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【算法】面试题 - 回溯算法解题套路框架

回溯算法解题套路框架前言回溯算法的框架排列(元素无重不可复选)46. 全排列解析子集(元素无重不可复选)78. 子集解析组合(元素无重不可复选)77. 组合解析子集/组合(元素可重不可复选&#xff09…

免费PDF转Word?有这几个网站就够了

如果您想使用 Word 文档,您可能需要将PDF 转换为 Word,以便您可以随意使用该文档。将 PDF 转换为 Word 的过程需要一个好的 PDF 转换器。在本文中,您将探索可用的 5个免费转换器,其中包括 奇客PDF 和PDF2Go。 最好的 6 个 PDF 转 …

【unity笔记】图解Vector3.SignedAngle()方法的返回值

首先看一下官方文档的说明: public static float SignedAngle (Vector3 from, Vector3 to, Vector3 axis); from测量角度差的源向量。to测量角度差的目标向量。axis一个向量,其他向量将绕其旋转。返回 from 与 to 之间的有符号角度(以度为单…

CodeQL 源代码漏洞扫描

目录 1、下载配置 codeql 1.1 配置 codeql 1.2 配置 maven 2、测试 codeql 漏洞检测 2.1 构建 codeql 查询数据库 2.2 漏洞检测 测试环境:centos7 jdk11 maven 1、下载配置 codeql 1.1 配置 codeql 下载安装 codeql-cli: https://github.com/github/code…

大数据系列——什么是Flink?Flink有什么用途?

目录 一、基本概念 批与流 数据可以作为无界流或有界流处理 二、什么是Flink? 三、Flink有什么用途? 四、适用场景 五、flink事件驱动 六、flink拥有分层API flink sql 七、fllink企业级使用 一、基本概念 批与流 批处理的特点是有界、持久、大…

被误认为是外国人开发的4款软件,功能强大到离谱,且用且珍惜

国外的月亮不一定比国内圆,随着国内互联网飞速发展,国内研发出许多实用又良心的软件,由于偏见,功能强大的它们却被误认为是外国佬研发的。 1、Foxit PDF用系统自带的Adobe实在难用,Foxit这款PDF阅读器实在太强大&#…

unity使用RenderTexture可以渲染粒子特效

一,使用UIRawImage,创建材质球,把Shader给材质球,放到RawImage的Material上, // Upgrade NOTE: replaced mul(UNITY_MATRIX_MVP,*) with UnityObjectToClipPos(*)Shader "UI/Default No-Alpha" {Properties{[PerRende…

基于文本和图像的网络舆情分析方法研究

基于文本和图像的网络舆情分析方法研究 一、舆情分析技术 (1)舆情数据采集与提取技术; (2)自动文摘技术; (3)事件发现与追踪技术; (4)舆情情感分…

【虚幻引擎UE】UE5 模型描边的三个方法

一、后期处理法 1、创建描边材质,方法很多种,主要有设置深度、法线描边等 可以参考现有文章制作或直接下载材质资源使用。 参考文章: 1、【UE4】几种后处理描边的方法,效果及效率 2、UE4之物体描边 3、【UE4_001】后期处理轮廓…

第002课 - 项目整体效果展示

文章目录 基础篇高级篇流量控制:alibaba sentinel注册中心链路追踪高可用集群篇CICD这个章节是进行项目效果的演示。 基础篇 第一个就是基础篇。 这是我们的后台管理系统。 围绕电商的管理系统做一个整套的增删改查逻辑。 这个商品系统都会教给大家来编写的。 这个是使用前…

网站报错:PHP Fatal error: Allowed memory size of 134217728 bytes exhausted的处理方法

原因分析 内存已耗尽,这关系到PHP的memory_limit的设置问题,根据自己的需要及参考本机的内存大小修改php内存限制。 解决方案 1、修改php.ini (改配置) memory_limit 128 这种方法需要重启服务器,很显然&#xff0c…

向Linux内核添加驱动的步骤详解

1、获取驱动源码 (1)驱动源码一般都是从设备厂商处获取; (2)设备厂商给的驱动源码大体上是没有问题的,能加载但是效果不一定好,需要根据自己的板子进行适配; 2、驱动在内核中的两种形式 (1)直接编译进内核:内核启动时自…

ubuntu下编译opencv

目录 1. 下载opencv和opencv-contrib 2. 安装依赖 3. cmake 4. make 5. 安装 6. 配置opencv的路径 7. 测试 后续 1. 下载opencv和opencv-contrib https://github.com/opencv/opencv/archive/refs/tags/4.6.0.zip https://github.com/opencv/opencv_contrib/archive/re…

python两种方式实现读写航拍影像JPG图片的GPS坐标

写入坐标效果 读取坐标效果 1、写入JPG坐标数据 1.1、准备数据 gps坐标文件 图片 可以查看它的属性中目前并没有坐标信息 1.2、执行脚本 第一种方法(piexif) writegps2jpg_piexif.py import csv,os import

KubeEdge云原生边缘计算公开课04——云原生边缘计算学术研究现状与趋势

KubeEdge云原生边缘计算公开课04——云原生边缘计算学术研究现状与趋势Ding Yin & 徐飞:KubeEdge架构与技术解读1. 边缘计算的形态定义与关键挑战2. 云原生边缘计算的优势与挑战3. KubeEdge核心架构4. KubeEdge关键技术5. KubeEdge社区介绍Ding Yin & 徐飞&…

JavaSE笔记——流式编程

文章目录前言一、从外部迭代到内部迭代二、实现机制三、常用的流操作1.collect(toList())2.map3.filter4.flatMap5.max和min6.reduce四、多次调用流操作五、高阶函数总结前言 流是一系列与特定存储机制无关的元素——实际上,流并没有 “存储” 之说。利用流&#x…

火山引擎 DataTester:如何做 A/B 实验的假设检验作者:字节跳动数据平台

A/B 实验的核心统计学理论是(双样本)假设检验,是用来判断样本与样本、样本与总体的差异是由 抽样误差 引起还是 本质差别 造成的一种统计推断方法。 假设检验,顾名思义,是一种对自己做出的假设进行数据验证的过程。通…

STM32CUBEMX_SDIO和FATFS_读写SD卡

STM32CUBEMX_SDIO和FATFS_读写SD卡 简述 FATFS是一个完全免费开源,专为小型嵌入式系统设计的FAT(File Allocation Table)文件系统模块。FATFS的编写遵循ANSI C,并且完全与磁盘I/O层分开。支持FAT12/FAT16/FAT32,支持多…

Django入门

Django 中文官网:初识 Django | Django 文档 | Django (djangoproject.com) Django 是一个由 Python 编写的一个开放源代码的 Web 应用框架。 使用 Django,只要很少的代码,Python 的程序开发人员就可以轻松地完成一个正式网站所需要的大部…

Python 学习笔记001-发布

Python 学习笔记001-发布Python如何发布为EXE文件发给别人装X0 我的开发环境Step 1 安装PyInstaller包Step2 打包Python文件Step 3 运行Python程序Step 4 最后附上Atm.py的代码Python如何发布为EXE文件发给别人装X 0 我的开发环境 Python : 3.10 PyCharm:2022.03 社区版 Ste…