当前位置: 首页 > news >正文

Oracle-OracleConnector

提示:OracleConnector 类是 Debezium 中用于与 Oracle 数据库交互的一个连接器组件

文章目录

  • 前言
  • 一、核心功能
  • 二、代码分析
  • 总结

前言

提示:OracleConnector 类负责配置、启动、管理和验证与 Oracle 数据库的连接,并为后续的数据捕获任务准备必要的配置。


提示:以下是本篇文章正文内容

一、核心功能

核心功能详细说明

  1. 配置管理:

    • 接收配置: 在 start 方法中接收配置属性 (props) 并将其转换为不可变的映射 (properties)。
    • 配置验证: 通过 config 方法返回配置定义,用于定义连接器所需的配置项。
    • 连接验证: 在 validateConnection 方法中测试与 Oracle 数据库的连接是否有效。如果连接失败,会记录错误日志并添加错误消息到配置值中。
  2. 任务管理:

    • 任务类指定: 在 taskClass 方法中返回 OracleConnectorTask 类,这是执行具体复制任务的类。
    • 任务配置: 在 taskConfigs 方法中返回任务配置列表,通常只包含一个配置映射,因为该连接器默认只支持单个任务。
  3. 版本信息:

    • 版本报告: 在 version 方法中返回连接器的版本信息。
  4. 表筛选:

    • 获取匹配表: 在 getMatchingCollections 方法中获取与配置过滤器匹配的 Oracle 表列表。这涉及读取数据库中的表信息,并根据配置过滤器筛选出目标表。
  5. 生命周期管理:

    • 启动: 在 start 方法中初始化连接器。
    • 停止: stop 方法为空,表示没有额外的清理工作需要执行。

二、代码分析

package io.debezium.connector.oracle;import java.sql.SQLException;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;import org.apache.kafka.common.config.ConfigDef;
import org.apache.kafka.common.config.ConfigValue;
import org.apache.kafka.connect.connector.Task;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import io.debezium.DebeziumException;
import io.debezium.config.Configuration;
import io.debezium.connector.common.RelationalBaseSourceConnector;
import io.debezium.relational.RelationalDatabaseConnectorConfig;
import io.debezium.relational.TableId;
import io.debezium.util.Strings;// 定义 OracleConnector 类,这是一个扩展了 RelationalBaseSourceConnector 的类,
// 用于从 Oracle 数据库捕获变更数据。
public class OracleConnector extends RelationalBaseSourceConnector {private static final Logger LOGGER = LoggerFactory.getLogger(OracleConnector.class);// 创建一个静态 Logger 实例,用于记录日志信息。private Map<String, String> properties;// 定义一个私有成员变量 properties,用于存储配置属性。@Overridepublic String version() {return Module.version();}// 实现 version() 方法,返回连接器的版本信息。@Overridepublic void start(Map<String, String> props) {this.properties = Collections.unmodifiableMap(new HashMap<>(props));}// 实现 start() 方法,接收配置属性并将其转换为不可变的映射。// 这个映射将在后续方法中使用。@Overridepublic Class<? extends Task> taskClass() {return OracleConnectorTask.class;}// 实现 taskClass() 方法,返回执行具体复制任务的类。@Overridepublic List<Map<String, String>> taskConfigs(int maxTasks) {if (maxTasks > 1) {throw new IllegalArgumentException("Only a single connector task may be started");}// 如果尝试启动的任务数大于 1,则抛出异常,因为该连接器只支持单个任务。return Collections.singletonList(properties);}// 实现 taskConfigs() 方法,返回任务配置列表。对于 OracleConnector,列表中只有一个配置映射。@Overridepublic void stop() {}// 实现 stop() 方法,用于执行清理工作。在这个实现中,没有额外的清理工作。@Overridepublic ConfigDef config() {return OracleConnectorConfig.configDef();}// 实现 config() 方法,返回配置定义,用于定义连接器所需的配置项。@Overrideprotected void validateConnection(Map<String, ConfigValue> configValues, Configuration config) {final ConfigValue databaseValue = configValues.get(RelationalDatabaseConnectorConfig.DATABASE_NAME.name());if (!databaseValue.errorMessages().isEmpty()) {return;}// 验证数据库名称配置项是否有效。final ConfigValue hostnameValue = configValues.get(RelationalDatabaseConnectorConfig.HOSTNAME.name());final ConfigValue userValue = configValues.get(RelationalDatabaseConnectorConfig.USER.name());// 获取主机名和用户名配置项。OracleConnectorConfig connectorConfig = new OracleConnectorConfig(config);try (OracleConnection connection = new OracleConnection(connectorConfig.getJdbcConfig())) {// 使用提供的配置创建 OracleConnection 实例,并尝试建立连接。LOGGER.debug("Successfully tested connection for {} with user '{}'", OracleConnection.connectionString(connectorConfig.getJdbcConfig()),connection.username());}catch (SQLException | RuntimeException e) {// 如果连接失败,记录错误日志并添加错误消息到配置值中。LOGGER.error("Failed testing connection for {} with user '{}'", config.withMaskedPasswords(), userValue, e);hostnameValue.addErrorMessage("Unable to connect: " + e.getMessage());}}// 实现 validateConnection() 方法,用于测试与 Oracle 数据库的连接是否有效。@Overrideprotected Map<String, ConfigValue> validateAllFields(Configuration config) {return config.validate(OracleConnectorConfig.ALL_FIELDS);}// 实现 validateAllFields() 方法,验证所有配置字段的有效性。@SuppressWarnings("unchecked")@Overridepublic List<TableId> getMatchingCollections(Configuration config) {final OracleConnectorConfig connectorConfig = new OracleConnectorConfig(config);final String databaseName = connectorConfig.getCatalogName();try (OracleConnection connection = new OracleConnection(connectorConfig.getJdbcConfig(), false)) {if (!Strings.isNullOrBlank(connectorConfig.getPdbName())) {connection.setSessionToPdb(connectorConfig.getPdbName());}// @TODO: we need to expose a better method from the connector, particularly getAllTableIds// the following's performance is acceptable when using PDBs but not as ideal with non-PDBreturn connection.readTableNames(databaseName, null, null, new String[]{ "TABLE" }).stream().filter(tableId -> connectorConfig.getTableFilters().dataCollectionFilter().isIncluded(tableId)).collect(Collectors.toList());}catch (SQLException e) {throw new DebeziumException(e);}}// 实现 getMatchingCollections() 方法,获取与配置过滤器匹配的 Oracle 表列表。// 这涉及读取数据库中的表信息,并根据配置过滤器筛选出目标表。}
  1. 封装:

    • OracleConnectorConfig: 封装了连接器的配置信息,使得配置管理更加清晰和易于维护。
    • OracleConnection: 封装了与 Oracle 数据库的连接逻辑,包括连接的建立、关闭以及执行特定的操作(如读取表名)。
  2. 继承与多态:

    • 虽然在这段代码中没有直接体现继承关系,但我们可以想象 OracleConnection 可能继承自一个更通用的 DatabaseConnection 类,实现了特定于 Oracle 的连接逻辑。
    • readTableNames 方法可能是一个多态方法,不同的数据库连接类可以有不同的实现方式。
  3. 依赖注入:

    • OracleConnectorConfigOracleConnection 的实例都是通过构造函数传递进来的,这符合依赖注入的原则,提高了代码的可测试性和灵活性。
  4. 异常处理:

    • 使用 try-with-resources 语句确保资源(如数据库连接)被正确关闭,即使发生异常也能释放资源。
    • 异常处理通过抛出 DebeziumException 来简化调用者的错误处理逻辑。
  5. 流式编程:

    • 使用 Java 8 的 Stream API 来处理表名的筛选过程,使得代码更加简洁和易于阅读。

启发

  1. 模块化设计:

    • 将复杂的逻辑分解成多个小的、独立的类,每个类负责一部分功能,这样可以提高代码的可读性和可维护性。
  2. 关注点分离:

    • 分离配置管理、连接管理和业务逻辑,每个部分都有明确的责任范围,这有助于减少耦合度和提高代码质量。
  3. 异常处理:

    • 明确异常处理策略,避免让异常“沉默”,确保程序的健壮性和稳定性。
  4. 资源管理:

    • 使用 try-with-resources 语句来自动管理资源,减少内存泄漏的风险。
  5. 代码复用:

    • 通过继承和多态等机制实现代码复用,减少重复代码,提高开发效率。 


总结

  1. private Map<String, String> properties:

    • 作用:存储配置属性的私有成员变量。
    • 说明:在 start 方法中被初始化为不可变的映射,用于后续方法中访问配置信息。

方法的含义

  1. public String version():

    • 作用:返回连接器的版本信息。
    • 说明:通过调用 Module.version() 返回连接器的具体版本号。
  2. public void start(Map<String, String> props):

    • 作用:初始化连接器,接收配置属性并将其转换为不可变的映射。
    • 说明:将传入的配置属性 props 转换为 HashMap,然后进一步转换为不可变映射 properties,供后续方法使用。
  3. public Class<? extends Task> taskClass():

    • 作用:返回执行具体复制任务的类。
    • 说明:返回 OracleConnectorTask.class,这是执行具体复制任务的类。
  4. public List<Map<String, String>> taskConfigs(int maxTasks):

    • 作用:返回任务配置列表。
    • 说明:对于 OracleConnector,列表中只有一个配置映射,即 properties。如果 maxTasks 大于 1,则抛出异常,因为该连接器只支持单个任务。
  5. public void stop():

    • 作用:执行清理工作。
    • 说明:在这个实现中,没有额外的清理工作。
  6. public ConfigDef config():

    • 作用:返回配置定义,用于定义连接器所需的配置项。
    • 说明:返回 OracleConnectorConfig.configDef(),定义了连接器所需的配置项。
  7. protected void validateConnection(Map<String, ConfigValue> configValues, Configuration config):

    • 作用:测试与 Oracle 数据库的连接是否有效。
    • 说明:使用提供的配置创建 OracleConnection 实例,并尝试建立连接。如果连接失败,记录错误日志并添加错误消息到配置值中。
  8. protected Map<String, ConfigValue> validateAllFields(Configuration config):

    • 作用:验证所有配置字段的有效性。
    • 说明:通过调用 config.validate(OracleConnectorConfig.ALL_FIELDS) 验证所有配置字段的有效性。
  9. public List<TableId> getMatchingCollections(Configuration config):

    • 作用:获取与配置过滤器匹配的 Oracle 表列表。
    • 说明:涉及读取数据库中的表信息,并根据配置过滤器筛选出目标表。使用 OracleConnection 类读取表名,并通过 Stream API 进行筛选。

OracleConnector 类是 Debezium 项目中的一个核心组件,用于与 Oracle 数据库交互。它通过封装配置管理、连接验证、任务管理等功能,实现了从 Oracle 数据库捕获变更数据的能力。每个成员变量和方法都有其特定的作用,共同构成了一个功能完整的 Oracle 数据库连接器。

相关文章:

Oracle-OracleConnector

提示&#xff1a;OracleConnector 类是 Debezium 中用于与 Oracle 数据库交互的一个连接器组件 文章目录 前言一、核心功能二、代码分析总结 前言 提示&#xff1a;OracleConnector 类负责配置、启动、管理和验证与 Oracle 数据库的连接&#xff0c;并为后续的数据捕获任务准备…...

『 Linux 』线程池与 POSIX 线程的封装编码实现

文章目录 线程池概念线程池的编码实现线程池的测试参考代码 线程的封装使用测试封装后的线程参考代码 线程池概念 池化技术是一种资源管理方法,通过预先创建和管理一组资源以便在需要使用时快速分配这些资源; 线程池是池化技术的一种典型应用; 资源分配 在线程池中预先创建一定…...

【C++】————哈希表

作者主页&#xff1a; 作者主页 本篇博客专栏&#xff1a;C 创作时间 &#xff1a;2024年8月6日 前言&#xff1a; 在计算机科学的广袤世界中&#xff0c;数据结构犹如基石&#xff0c;支撑着各种高效算法的构建与运行。而哈希表&#xff08;Hash Table&#xff09;&#…...

前端学习AI历程

AI基本概念tensorflow入门conda搭建环境&#xff0c;pycham使用训练自己的第一个模型AI目前前端方便入手的几个方向 素材图片库图像识别&#xff0c;在线学习低代码应用智能客服 获取数据集 roboflowkagglecocomakesense&#xff08;用于打标&#xff09; 认识yolo两个简单小应…...

常见中间件漏洞复现之【Tomcat】!

Tomcat介绍 tomcat是⼀个开源⽽且免费的jsp服务器&#xff0c;默认端⼝ : 8080&#xff0c;属于轻量级应⽤服务器。它可以实现 JavaWeb程序的装载&#xff0c;是配置JSP&#xff08;Java Server Page&#xff09;和JAVA系统必备的⼀款环境。 在历史上也披露出来了很多的漏洞 …...

C++并发编程(一):线程基础

简介 本文学习的是 b 站 up 恋恋风辰的并发编程教学视频做的一些笔记补充。 教程视频链接如下&#xff1a;线程基础&#xff1a;视频教程 文档链接如下&#xff1a;线程基础&#xff1a;笔记文档 理论上直接看 up 提供的笔记文档即可&#xff0c;我这里主要是记录一些我自己…...

enq: HW - contention事件来啦

业务系统反应数据库慢&#xff0c;根据时间查看awr报告。 先看一眼事件名称 HW enqueue 用于序列化超出段高水位线的空间分配。如果同时向对象添加大量数据&#xff0c;则多个进程可能同时尝试在高水位线上方分配空间&#xff0c;从而导致争用。 既然是控制资源并发的enq&…...

MyBatis补充

控制类和dao层接口以及mapper中的xml是怎样的关联的&#xff1f; 在Mybatis中&#xff0c;控制类和dao层接口是通过mapper的xml文件进行连接的。 控制类调用dao层接口中的方法&#xff0c;通过接口实现进行访问数据库操作。dao层接口定义数据库操作的方法&#xff0c;提供给控制…...

系统架构师(每日一练16)

每日一练 答案与解析 1.软件测试一般分为两个大类:动态测试和静态测试。前者通过运行程序发现错误&#xff0c;包括()等方法;后者采用人工和计算机辅助静态分析的手段对程序进行检测&#xff0c;包括()等方法。答案与解析 问题1 A.边界值分析、逻辑覆盖、基本路径 B.桌面检查、…...

实践致知第17享:电脑忽然黑屏的常见原因及处理方法

一、背景需求 小姑电话说&#xff1a;最近&#xff0c;电脑忽然就黑屏了&#xff08;如下图所示&#xff09;&#xff0c;但是等待几十秒甚至一分钟&#xff0c;电脑就能自然恢复了&#xff0c;这种状况一天能出现三四次&#xff0c;怎么办&#xff1f; 二、分析诊断 电脑黑屏…...

微信小程序--实现地图定位---获取经纬度

(1) (2) (3) html: <view class"titleTwo" style"border: none;"><view class"fontSize30 invoiceTile">企业地址</view><view class"invoiceRight" bind:tap"tapChooseAddress" data-maptype"…...

【Python系列】使用 `isinstance()` 替代 `type()` 函数

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

【多模态大模型】 BLIP-2 in ICML 2023

一、引言 论文&#xff1a; BLIP-2: Bootstrapping Language-Image Pre-training with Frozen Image Encoders and Large Language Models 作者&#xff1a; Salesforce Research 代码&#xff1a; BLIP-2 特点&#xff1a; 该方法分别使用冻结的图像编码器&#xff08;ViT-L/…...

HPC高性能计算平台

随着技术的发展和数据量的爆炸性增长&#xff0c;企业面临的挑战日益复杂&#xff0c;对计算能力的需求也在不断增加。这些问题的解决超出了传统计算方法的能力范围&#xff0c;高性能计算&#xff08;HPC&#xff09;正是为解决这类问题而生。 高性能计算&#xff08;HPC&…...

前端常用的几个工具网站

觉得不错的前端工具类网站 1、Grid布局生成 https://cssgrid-generator.netlify.app 2、拟物按钮样式生成 https://neumorphism.io 3、玻璃形态效果 在线制作CSS玻璃形态 4、一些Button、checkBox、switch、card的css样式 零代码 - 精美CSS样式库 5、CSS阴影生成 在线创建…...

支付功能之代收代付

有很多老板问小编&#xff1a;“这个分账功能好是好&#xff0c;也能搞定项目中的二清问题和税务纠纷&#xff0c;但还是太复杂了&#xff0c;每次要添加被分账对象都需要提交材料进行审核&#xff0c;太繁琐了&#xff0c;有没有更方便快捷的支付产品来解决资金问题&#xff1…...

QPixmap

pixel[ˈpɪksl]像素 QPixmap 是 Qt 框架中用于处理图像的一个类。它主要用于在屏幕上显示和处理图像&#xff0c;提供了许多实用的功能&#xff0c;如加载、保存、缩放、旋转、合并等。 绘制 从文件加载&#xff1a;从指定文件加载图像。 QPixmap pixmap(":/images/exam…...

Laravel门面之下:构建自定义门面应用的艺术

Laravel门面之下&#xff1a;构建自定义门面应用的艺术 在Laravel框架中&#xff0c;门面&#xff08;Facade&#xff09;提供了一种将类静态调用与面向对象代码解耦的优雅方式。门面是一个全局可访问的类&#xff0c;它为底层复杂的服务提供了一个简单的接口。然而&#xff0…...

智启万象 | 2024 Google 开发者大会直播攻略

8 月 7 日上午 9:30 2024 Google 开发者大会 主旨演讲直播将准时开启 想要在线上探索大会精彩内容&#xff1f; 快查收这份观看指南&#xff01; 8 月 7 日上午 9:30 2024 Google 开发者大会开幕 锁定大会官网观看主旨演讲现场直播&#xff01; 本次大会内容将同步于多个…...

技巧:print打印内容到控制台时信息显示不全

# 请求一个接口&#xff0c;res是响应内容&#xff0c;使用res.text打印的信息不全 #使用流式处理响应 #如果你需要流式处理大的响应&#xff0c;确保你在处理响应内容的同时不会提前结束流。resself.request_base(select_api,change_datachange_data)print("")# pri…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...