Kafka Connect Debezium DB2连接器无法捕获XML类型列问题求助
解决Debezium同步DB2 XML列返回对象引用而非XML内容的问题
问题分析
核心问题在于DB2 JDBC驱动返回的XML列对象是com.ibm.db2.jcc.am.DC(DB2 XML类型的实现类),直接调用toString()只会返回对象的内存引用字符串,而非实际XML内容。同时你使用的Debezium 2.2.1对DB2 11.5.8的XML类型自动转换存在兼容问题,这也是初始警告出现的原因。
解决方案
修改自定义转换器的转换逻辑,调用DB2 XML对象专属方法提取实际XML字符串,代码示例如下:
import com.ibm.db2.jcc.DB2Xml; import io.debezium.spi.converter.CustomConverter; import io.debezium.spi.converter.ConverterRegistration; import org.apache.kafka.connect.data.SchemaBuilder; import java.sql.SQLException; import java.util.Properties; public class XmlConverter implements CustomConverter<SchemaBuilder, RelationalColumn> { private SchemaBuilder xmlSchema; @Override public void configure(Properties props) { xmlSchema = SchemaBuilder.string().name(props.getProperty("schema.name")); } @Override public void converterFor(RelationalColumn column, ConverterRegistration<SchemaBuilder> registration) { if ("xml".equalsIgnoreCase(column.typeName())) { registration.register(xmlSchema, value -> { if (value == null) { return null; } // 强转为DB2 XML接口,调用getString()获取原始XML内容 try { return ((DB2Xml) value).getString(); } catch (SQLException e) { throw new RuntimeException("提取DB2 XML内容失败", e); } }); } } }
关键细节
DB2Xml是DB2 JDBC驱动定义的XML类型接口,com.ibm.db2.jcc.am.DC是它的实现类,强转后调用getString()可直接获取XML字符串。- 必须捕获
SQLException,DB2 XML对象读取内容时可能抛出数据库相关异常。 - 确保自定义转换器项目引入DB2 JDBC驱动依赖(以Maven为例):
<dependency> <groupId>com.ibm.db2</groupId> <artifactId>jcc</artifactId> <version>11.5.8.0</version> </dependency>
连接器配置验证
在Debezium DB2连接器配置中正确指定自定义转换器:
# 自定义转换器配置 transforms=xmlConverter transforms.xmlConverter.type=com.yourpackage.XmlConverter transforms.xmlConverter.schema.name=com.yourcompany.XmlString
额外提示
若后续升级Debezium到2.3+版本,可重新测试官方自动转换逻辑——你参考的是2.3版本文档,但当前使用的是2.2.1,版本差异可能是初始警告的根源。
内容的提问来源于stack exchange,提问作者George Bernard Tan
相关产品推荐
相关产品推荐

