提示:
Db2Connector
类是 Debezium 中的一个关键组件,其核心功能是作为连接器来捕获 IBM Db2 数据库的变更数据
前言
提示:Db2Connector
是 Debezium 框架中针对 IBM Db2 数据库设计的源连接器实现。它的主要职责包括配置管理、任务初始化、连接验证、版本报告以及数据库表结构的发现
提示:以下是本篇文章正文内容
一、核心功能
核心功能详细说明
1. 版本信息报告
- 方法:
version()
- 功能: 返回当前 Debezium 模块的版本信息。这在系统维护和故障排查时非常重要,因为不同的版本可能具有不同的特性或已知问题。
- 内部实现: 调用
Module.version()
方法来获取版本字符串,这通常是在构建时由构建工具注入的。
2. 启动与配置加载
- 方法:
start(Map<String, String> props)
- 功能: 在连接器启动时,接收来自外部的配置参数映射,并将其转换为不可修改的映射形式存储,以便后续操作使用。
- 内部实现: 将传入的配置参数映射复制到一个新的
HashMap
中,然后使用Collections.unmodifiableMap
方法将其包装成不可修改的形式。
3. 任务管理
- 方法:
taskClass()
- 功能: 返回连接器所使用的任务类,即
Db2ConnectorTask
。任务类负责具体的数据库监听和数据变化捕捉工作。 - 方法:
taskConfigs(int maxTasks)
- 功能: 根据最大任务数生成配置列表。由于 Db2Connector 设计上只支持单个任务,因此此方法总是返回一个只包含初始配置的单一映射。
- 内部实现: 检查
maxTasks
是否大于1,如果是,则抛出IllegalArgumentException
异常,表示不支持多任务;否则返回一个包含初始配置的单一映射列表。
4. 停止连接器
- 方法:
stop()
- 功能: 当连接器需要停止时调用,但在此实现中并未定义任何具体的停止逻辑。
5. 配置定义
- 方法:
config()
- 功能: 返回一个
ConfigDef
对象,定义了连接器支持的所有配置选项及其默认值和验证规则。 - 内部实现: 调用
Db2ConnectorConfig.configDef()
来获取配置定义。
6. 连接验证
- 方法:
validateConnection(Map<String, ConfigValue> configValues, Configuration config)
- 功能: 在连接器启动前验证数据库连接的正确性。这包括尝试建立连接、执行一个简单的 SQL 查询来确认连接有效性。
- 内部实现: 使用
Db2ConnectorConfig
和Db2Connection
类来建立数据库连接,执行 SQL 查询"SELECT 1 FROM sysibm.sysdummy1"
,并记录日志信息。
7. 配置字段验证
- 方法:
validateAllFields(Configuration config)
- 功能: 验证所有配置字段,确保它们满足预期的格式和约束。
- 内部实现: 调用
config.validate(Db2ConnectorConfig.ALL_FIELDS)
方法,返回一个包含所有配置项及其验证结果的映射。
8. 数据库表结构发现
- 方法:
getMatchingCollections(Configuration config)
- 功能: 动态发现数据库中的表结构,返回一个包含所有可监控表的
TableId
列表。 - 内部实现: 使用
Db2ConnectorConfig
和Db2Connection
类建立数据库连接,执行 SQL 查询来获取所有表名,然后返回一个TableId
的列表。
二、代码分析
package io.debezium.connector.db2;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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.annotation.ThreadSafe;
import io.debezium.config.Configuration;
import io.debezium.connector.common.RelationalBaseSourceConnector;
import io.debezium.relational.RelationalDatabaseConnectorConfig;
import io.debezium.relational.TableId;
/**
* 主连接器类,用于实例化配置和执行类。
*
* 作者:Jiri Pechanec, Luis Garcés-Erice
*/
@ThreadSafe
public class Db2Connector extends RelationalBaseSourceConnector {
/** 日志记录器实例。 */
private static final Logger LOGGER = LoggerFactory.getLogger(Db2Connector.class);
/** 属性映射。 */
private Map<String, String> properties;
/**
* 返回模块的版本信息。
*
* @return 模块版本字符串
*/
@Override
public String version() {
return Module.version();
}
/**
* 开始连接器任务。
*
* @param props 连接器属性
*/
@Override
public void start(Map<String, String> props) {
this.properties = Collections.unmodifiableMap(new HashMap<>(props));
}
/**
* 返回可执行任务的类。
*
* @return Db2ConnectorTask类
*/
@Override
public Class<? extends Task> taskClass() {
return Db2ConnectorTask.class;
}
/**
* 配置多个任务。
*
* @param maxTasks 最大任务数
* @return 包含配置的任务列表
*/
@Override
public List<Map<String, String>> taskConfigs(int maxTasks) {
if (maxTasks > 1) {
throw new IllegalArgumentException("仅允许启动单个连接器任务");
}
return Collections.singletonList(properties);
}
/**
* 停止连接器任务。
*/
@Override
public void stop() {
}
/**
* 返回配置定义。
*
* @return 配置定义对象
*/
@Override
public ConfigDef config() {
return Db2ConnectorConfig.configDef();
}
/**
* 验证数据库连接。
*
* @param configValues 配置值映射
* @param config 配置对象
*/
@Override
protected void validateConnection(Map<String, ConfigValue> configValues, Configuration config) {
ConfigValue hostnameValue = configValues.get(RelationalDatabaseConnectorConfig.HOSTNAME.name());
// 尝试连接数据库...
Db2ConnectorConfig connectorConfig = new Db2ConnectorConfig(config);
try (Db2Connection connection = new Db2Connection(connectorConfig)) {
try {
connection.connect();
connection.execute("SELECT 1 FROM sysibm.sysdummy1");
LOGGER.info("成功测试了{}的连接,用户为'{}'", connection.connectionString(), connection.username());
}
catch (SQLException e) {
LOGGER.error("测试{}的连接失败,用户为'{}'", connection.connectionString(), connection.username(), e);
hostnameValue.addErrorMessage("无法连接: " + e.getMessage());
}
}
catch (SQLException e) {
LOGGER.error("关闭数据库连接时出现意外错误", e);
}
}
/**
* 验证所有字段。
*
* @param config 配置对象
* @return 验证后的配置值映射
*/
@Override
protected Map<String, ConfigValue> validateAllFields(Configuration config) {
return config.validate(Db2ConnectorConfig.ALL_FIELDS);
}
/**
* 获取匹配的集合列表。
*
* @param config 配置对象
* @return 表ID列表
*/
@SuppressWarnings("unchecked")
@Override
public List<TableId> getMatchingCollections(Configuration config) {
Db2ConnectorConfig connectorConfig = new Db2ConnectorConfig(config);
try (Db2Connection connection = new Db2Connection(connectorConfig)) {
return new ArrayList<>(
connection.readTableNames(null, null, null, new String[]{ "TABLE" }));
}
catch (SQLException e) {
throw new DebeziumException(e);
}
}
}
总结
提示:Db2Connector
类在 Debezium 框架中扮演着中心角色,它不仅负责管理连接器的生命周期,还承担着与 Db2 数据库交互的重任,包括配置管理、连接验证、任务调度、以及数据库结构的动态发现。通过上述详尽的解析,我们可以更深入地理解 Db2Connector
如何高效、安全地与 Db2 数据库协同工作,为数据同步和流处理提供坚实的基础。