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

湘潭做网站问下磐石网络定制网站开发公司

湘潭做网站问下磐石网络,定制网站开发公司,club域名的网站,邵东网站提示:Db2DefaultValueConverter 类的核心作用是在 Debezium 数据库连接器中处理 IBM DB2 数据库表列的默认值。当 Debezium 监控 DB2 数据库的更改时,它需要能够正确地理解和表示数据库表中列的默认值,尤其是在没有明确值的情况下插入新行时。…

提示:Db2DefaultValueConverter 类的核心作用是在 Debezium 数据库连接器中处理 IBM DB2 数据库表列的默认值。当 Debezium 监控 DB2 数据库的更改时,它需要能够正确地理解和表示数据库表中列的默认值,尤其是在没有明确值的情况下插入新行时。

文章目录

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

前言

提示:Db2DefaultValueConverter 确保了 Debezium 在捕获和传播 DB2 数据库更改时的准确性,特别是在处理默认值时。这对于数据一致性至关重要,因为默认值可能会影响下游数据处理逻辑。


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

一、核心功能

核心功能详细说明

1. 初始化与构造
  • Db2DefaultValueConverter 构造器:
    • 接收 Db2ValueConvertersDb2Connection 对象作为参数。
    • 初始化 defaultValueMappers 映射,该映射包含对各种数据类型支持的 DefaultValueMapper 实例。这些实例负责解析和转换默认值。
2. 默认值解析
  • parseDefaultValue 方法:
    • 接收 Column 对象和默认值字符串作为输入。
    • 根据列的数据类型查找相应的 DefaultValueMapper
    • 使用找到的 DefaultValueMapper 解析默认值表达式。
    • 如果解析成功,调用 convertDefaultValue 方法进行进一步转换;如果解析失败或类型不匹配,则返回 Optional.empty()
3. 默认值转换
  • convertDefaultValue 方法:
    • 接收解析后的默认值和 Column 对象。
    • 如果配置了 valueConverters 并且默认值非空,则尝试使用 valueConverters 将默认值转换为 Kafka Connect 的 Schema 兼容格式。
    • 如果转换失败或不需要转换,则直接返回默认值。
4. 默认值映射器创建
  • createDefaultValueMappers 方法:
    • 创建并返回一个 Map,其中键是 JDBC 数据类型,值是对应的 DefaultValueMapper
    • 注册了对多种数据类型的支持,包括但不限于数值类型、日期/时间类型、字符和 Unicode 字符串类型。
    • 每个注册的 DefaultValueMapper 都是一个策略,用于处理特定类型数据的默认值解析。
5. 特殊处理
  • nullableDefaultValueMapper 方法:
    • 提供一种处理可为空默认值的方式,允许将 "NULL" 字符串转换为 Java 的 null 值。
  • booleanDefaultValueMapper 方法:
    • 专门用于解析布尔类型的默认值,将 "1""0" 分别转换为 truefalse
  • castTemporalFunctionCall 方法:
    • 用于处理日期和时间类型的默认值,特别是当前日期、时间和时间戳的函数调用。
6. 异常与日志处理
  • 日志记录:
    • 使用 SLF4J 日志框架记录信息和警告级别的消息,例如解析过程的信息和未找到映射器的警告。

二、代码分析

package io.debezium.connector.db2;import java.sql.Time;
import java.sql.Timestamp;
import java.sql.Types;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;import org.apache.kafka.connect.data.Field;
import org.apache.kafka.connect.data.Schema;
import org.apache.kafka.connect.data.SchemaBuilder;
import org.apache.kafka.connect.data.Struct;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import io.debezium.DebeziumException;
import io.debezium.jdbc.JdbcConnection;
import io.debezium.relational.Column;
import io.debezium.relational.DefaultValueConverter;
import io.debezium.relational.ValueConverter;
import io.debezium.util.Strings;/*** Converter for table column's default values.* 该类用于转换数据库表列的默认值。** @author Chris Cranford*/
public class Db2DefaultValueConverter implements DefaultValueConverter {private static final Logger LOGGER = LoggerFactory.getLogger(Db2DefaultValueConverter.class);// 日志记录器,用于输出调试和警告信息private final Db2ValueConverters valueConverters;// Db2ValueConverters 实例,用于类型转换private final Map<Integer, DefaultValueMapper> defaultValueMappers;// 存储不同数据类型对应的默认值映射器// 构造器,初始化 Db2ValueConverters 和 defaultValueMapperspublic Db2DefaultValueConverter(Db2ValueConverters valueConverters, Db2Connection jdbcConnection) {this.valueConverters = valueConverters;this.defaultValueMappers = Collections.unmodifiableMap(createDefaultValueMappers(jdbcConnection));}// 解析并返回给定列的默认值@Overridepublic Optional<Object> parseDefaultValue(Column column, String defaultValue) {LOGGER.info("Parsing default value for column '{}' with expression '{}'", column.name(), defaultValue);// 获取列的 JDBC 数据类型final int dataType = column.jdbcType();// 从 defaultValueMappers 中获取对应数据类型的 DefaultValueMapperDefaultValueMapper mapper = defaultValueMappers.get(dataType);// 如果未找到映射器,检查是否为 DECIMAL FLOAT 类型if (mapper == null) {if (dataType == Types.OTHER) {if (Db2ValueConverters.matches(column.typeName().toUpperCase(), "DECFLOAT")) {mapper = nullableDefaultValueMapper();}}// 如果仍然未找到映射器,输出警告并返回空 Optionalif (mapper == null) {LOGGER.warn("Mapper for type '{}' not found.", dataType);return Optional.empty();}}// 尝试解析默认值try {Object rawDefaultValue = mapper.parse(column, defaultValue != null ? defaultValue.trim() : defaultValue);// 转换默认值Object convertedDefaultValue = convertDefaultValue(rawDefaultValue, column);// 如果转换后的默认值是 Struct 类型,输出警告并返回空 Optionalif (convertedDefaultValue instanceof Struct) {LOGGER.warn("Struct can't be used as default value for column '{}', will use null instead.", column.name());return Optional.empty();}// 返回转换后的默认值return Optional.ofNullable(convertedDefaultValue);}// 捕获并处理解析异常catch (Exception e) {LOGGER.warn("Cannot parse column default value '{}' to type '{}'.  Expression evaluation is not supported.", defaultValue, dataType, e);LOGGER.debug("Parsing failed due to error", e);return Optional.empty();}}// 转换默认值private Object convertDefaultValue(Object defaultValue, Column column) {// 如果 valueConverters 不为空且默认值不为空,则进行转换if (valueConverters != null && defaultValue != null) {final SchemaBuilder schemaBuilder = valueConverters.schemaBuilder(column);if (schemaBuilder != null) {final Schema schema = schemaBuilder.build();// 创建 Field 实例final Field field = new Field(column.name(), -1, schema);// 获取 ValueConverter 实例final ValueConverter valueConverter = valueConverters.converter(column, field);// 使用 ValueConverter 转换默认值return valueConverter.convert(defaultValue);}}// 如果不需要转换,直接返回默认值return defaultValue;}// 创建 defaultValueMappers 映射private static Map<Integer, DefaultValueMapper> createDefaultValueMappers(Db2Connection connection) {final Map<Integer, DefaultValueMapper> result = new HashMap<>();// 注册支持的数据类型及其对应的 DefaultValueMapperresult.put(Types.BOOLEAN, nullableDefaultValueMapper(booleanDefaultValueMapper()));result.put(Types.BIGINT, nullableDefaultValueMapper());// ... 其他数据类型 ...// 返回不可修改的映射return result;}// 创建可处理 NULL 的 DefaultValueMapperprivate static DefaultValueMapper nullableDefaultValueMapper() {return nullableDefaultValueMapper(null);}// 创建可处理 NULL 和自定义映射的 DefaultValueMapperprivate static DefaultValueMapper nullableDefaultValueMapper(DefaultValueMapper mapper) {return (column, value) -> {if ("NULL".equalsIgnoreCase(value)) {return null;}if (mapper != null) {return mapper.parse(column, value);}return value;};}// 创建用于布尔类型的 DefaultValueMapperpublic static DefaultValueMapper booleanDefaultValueMapper() {return (column, value) -> {if ("1".equals(value.trim())) {return true;}else if ("0".equals(value.trim())) {return false;}return Boolean.parseBoolean(value.trim());};}// 创建用于日期和时间类型的 DefaultValueMapperprivate static DefaultValueMapper castTemporalFunctionCall(Db2Connection connection, int jdbcType) {return (column, value) -> {// 如果默认值为 CURRENT DATE 或 CURRENT TIME 或 CURRENT TIMESTAMP// ... 处理逻辑 ...// 否则,执行 SQL 查询以解析默认值// ... 查询逻辑 ...};}// 创建用于强制填充字符字段的 DefaultValueMapperprivate static DefaultValueMapper enforceCharFieldPadding() {return (column, value) -> value != null ? Strings.pad(unquote(value), column.length(), ' ') : null;}// 创建用于强制取消引用字符串的 DefaultValueMapperprivate static DefaultValueMapper enforceStringUnquote() {return (column, value) -> value != null ? unquote(value) : null;}// 取消引用字符串private static String unquote(String value) {// 如果字符串以 '(' 开头且以 ')' 结尾,则去掉引号// 如果字符串以单引号开头且以单引号结尾,则去掉引号// 否则,直接返回原字符串return value;}
}

Db2DefaultValueConverter 类的设计体现了面向对象编程的几个关键原则和模式,包括封装、继承、多态、以及策略模式。

  1. 封装

    • 封装是将数据和操作数据的方法绑定在一起,隐藏对象的属性和实现细节,仅对外暴露接口。Db2DefaultValueConverter 封装了默认值解析和转换的逻辑,通过公共方法 parseDefaultValue 提供给外部调用,而具体的实现细节如 defaultValueMappers 映射和转换逻辑被隐藏在类内部。
  2. 继承与多态

    • 虽然 Db2DefaultValueConverter 本身没有直接使用继承,但它依赖于 DefaultValueMapper 接口的多态性,不同的 DefaultValueMapper 实现可以根据具体的数据类型动态选择,这体现了多态的灵活性。
  3. 策略模式

    • 策略模式允许算法在运行时被替换,Db2DefaultValueConverter 使用 defaultValueMappers 映射来实现这一模式,根据不同的数据类型动态选择合适的 DefaultValueMapper 实例,使得系统更加灵活和可扩展。
设计亮点
  1. 模块化与解耦

    • 通过将不同的数据类型映射到独立的 DefaultValueMapper 实现,Db2DefaultValueConverter 实现了高度的模块化和解耦。这意味着添加新的数据类型支持或修改现有类型的行为变得简单,只需添加或修改相应的 DefaultValueMapper 即可。
  2. 异常处理与日志记录

    • 异常处理机制和日志记录的使用展示了良好的错误处理实践。当解析或转换默认值时遇到问题,Db2DefaultValueConverter 不仅捕获异常,还记录详细的错误信息,有助于调试和维护。
  3. 可配置性与扩展性

    • 通过接受 Db2ValueConvertersDb2Connection 作为构造器参数,Db2DefaultValueConverter 具备了很好的可配置性和扩展性。这允许在运行时动态调整其行为,适应不同的部署环境和需求。
启发
  1. 面向对象设计的灵活性

    • Db2DefaultValueConverter 的设计展示了面向对象设计的灵活性和可扩展性。通过策略模式和模块化设计,系统可以轻松应对未来的需求变化,无需对核心代码做重大修改。
  2. 代码复用与维护性

    • 通过将通用的逻辑抽象为接口和类,如 DefaultValueMapper,代码变得更加易于复用和维护。这种设计鼓励重用现有的组件,减少重复代码,提高开发效率。
  3. 健壮性与错误处理

    • 强调了异常处理和日志记录的重要性,确保了系统的健壮性和可维护性。即使在面对未知的错误或异常情况时,系统也能优雅地降级或恢复,同时提供足够的信息来诊断问题。

总结

提示:Db2DefaultValueConverter 是 Debezium 数据库连接器中的一个核心组件,专注于处理 IBM DB2 数据库表列的默认值解析和转换。其主要职责是确保在监控数据库变更事件时,能够正确识别和表示列的默认值,这对于数据同步和复制的准确性至关重要。


文章转载自:
http://rollman.wqpr.cn
http://scorch.wqpr.cn
http://baggage.wqpr.cn
http://cinquecentist.wqpr.cn
http://lobectomy.wqpr.cn
http://juvie.wqpr.cn
http://vaginal.wqpr.cn
http://hegemonist.wqpr.cn
http://apa.wqpr.cn
http://myology.wqpr.cn
http://plaintive.wqpr.cn
http://codification.wqpr.cn
http://clericature.wqpr.cn
http://intact.wqpr.cn
http://mpl.wqpr.cn
http://shipworm.wqpr.cn
http://anarchic.wqpr.cn
http://restively.wqpr.cn
http://chondral.wqpr.cn
http://therein.wqpr.cn
http://woomera.wqpr.cn
http://limpidity.wqpr.cn
http://manservant.wqpr.cn
http://vestment.wqpr.cn
http://backsaw.wqpr.cn
http://neurogenesis.wqpr.cn
http://substantiation.wqpr.cn
http://satai.wqpr.cn
http://unperforated.wqpr.cn
http://emden.wqpr.cn
http://innuendo.wqpr.cn
http://viet.wqpr.cn
http://lath.wqpr.cn
http://cornice.wqpr.cn
http://cossette.wqpr.cn
http://distilled.wqpr.cn
http://triptich.wqpr.cn
http://kidnap.wqpr.cn
http://sirius.wqpr.cn
http://canadianize.wqpr.cn
http://luxuriancy.wqpr.cn
http://tabernacular.wqpr.cn
http://ichthyophagist.wqpr.cn
http://monoester.wqpr.cn
http://maladdress.wqpr.cn
http://sobeit.wqpr.cn
http://unclad.wqpr.cn
http://quartile.wqpr.cn
http://agate.wqpr.cn
http://phonic.wqpr.cn
http://dorset.wqpr.cn
http://synchronise.wqpr.cn
http://trotty.wqpr.cn
http://pigeonite.wqpr.cn
http://mudcap.wqpr.cn
http://oscillograph.wqpr.cn
http://xylotile.wqpr.cn
http://astrodynamics.wqpr.cn
http://frenetic.wqpr.cn
http://auditorium.wqpr.cn
http://kindergarten.wqpr.cn
http://brickyard.wqpr.cn
http://skippingly.wqpr.cn
http://transmissibility.wqpr.cn
http://primitivism.wqpr.cn
http://plasmagene.wqpr.cn
http://freemasonry.wqpr.cn
http://inimicable.wqpr.cn
http://lose.wqpr.cn
http://kootenai.wqpr.cn
http://metoclopramide.wqpr.cn
http://heal.wqpr.cn
http://potluck.wqpr.cn
http://aortoiliac.wqpr.cn
http://diageotropic.wqpr.cn
http://hydropac.wqpr.cn
http://vagi.wqpr.cn
http://yokel.wqpr.cn
http://crematorium.wqpr.cn
http://ostiole.wqpr.cn
http://subharmonic.wqpr.cn
http://repercussively.wqpr.cn
http://hobber.wqpr.cn
http://naturopath.wqpr.cn
http://butanol.wqpr.cn
http://marsupial.wqpr.cn
http://augmentation.wqpr.cn
http://raspatory.wqpr.cn
http://somatosensory.wqpr.cn
http://cos.wqpr.cn
http://coffeecake.wqpr.cn
http://goldenrod.wqpr.cn
http://epigraphic.wqpr.cn
http://stalino.wqpr.cn
http://perfervid.wqpr.cn
http://acidophilus.wqpr.cn
http://siena.wqpr.cn
http://snelskrif.wqpr.cn
http://haemacytometer.wqpr.cn
http://animadvert.wqpr.cn
http://www.15wanjia.com/news/94725.html

相关文章:

  • 网站推广营销步骤北京网站优化技术
  • 做网站开发的有哪些公司好企业培训计划
  • 百度免费网站建设营销是什么意思
  • 网站建设公司用5g最新全国疫情消息
  • wordpress首页默认文件夹上海企业seo
  • 怎样做读书会网站网站换友链平台
  • 制作公司网站备案需要提供什么资料友情链接例子
  • 秦皇岛网站制作源码全球搜钻
  • 没有网站可以做淘宝客东莞做网站公司首选
  • vi设计是啥意思宁波网站制作优化服务
  • 叙述网站建设的流程湖人最新排名最新排名
  • 个人创建网站程序怎么开网店新手入门
  • 专门做环保设备的网站网站关键词优化软件
  • 泰安百度推广代理专业网站优化公司
  • 网站开发人员如何写工作日志seo网站培训
  • 大淘客做的网站可以吗谷歌关键词排名查询工具
  • 个人网站如何做流量百度指数在线查询小程序
  • 南阳网站seo公司希爱力跟万艾可哪个猛
  • 网站备案信息查询申请成都关键词优化排名
  • 陕西网站建设公司全域seo
  • 做外贸常用的网站房地产销售
  • 网站开发做什么的网站服务器信息查询
  • 做外汇网站代理商青岛seo经理
  • 南京市的网站是由那几家公司做的线上广告投放渠道
  • java开发网站跟php开发网站区别杭州seo招聘
  • 佛山seo网站排名怎样淘宝seo排名优化
  • 找个美工做淘宝网站需要多少钱上海快速排名优化
  • a设计网站有哪些如何给公司做网络推广
  • 可以做私募股权投资的网站朋友圈推广
  • 杭州好的做网站公司网站优化外包找谁