You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle JDBC参数解决Kafka Connect报ORA-22922错误

问题:Kafka Connect读取Oracle大JSON聚合字段时抛出ORA-22922错误

场景与错误信息

  • 开发Kafka Connect任务,通过SQL从Oracle数据库拉取数据,SQL结构如下:
select 
    X,X,X,
    JSON_ARRAYAGG(
        JSON_OBJECT(
            X,X,X
        )
    )
from ...
  • 当JSON_ARRAYAGG生成的内容超过18000字符,且结果集中存在两条这类数据时,触发以下错误:
org.apache.kafka.connect.errors.DataException: java.sql.SQLException: ORA-22922: nonexistant LOB value at io.confluent.connect.jdbc.source.TimestampTableQuerier.doExtractRecord(TimestampTableQuerier.java:150) at ... 
Caused by: java.sql.SQLException: ORA-22922: nonexistant LOB value at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:509) at ...
  • 在DBeaver中复现问题后,取消勾选**“Use Cache for CLOB value”**可解决,但未找到Oracle JDBC对应参数添加到Kafka Connect的YAML配置中。

已尝试方案

  • 缩减SQL返回值,定位出问题的两条数据;
  • 尝试将Blob转为文本,问题依旧。

解决方案

Oracle JDBC有对应的参数可以控制LOB缓存,对应DBeaver的“Use Cache for CLOB value”配置项,可通过以下参数在Kafka Connect的YAML配置中设置:

在JDBC源连接器的配置里,添加到connection.properties中:

connector.class: io.confluent.connect.jdbc.JdbcSourceConnector
connection.url: jdbc:oracle:thin:@//your-oracle-host:port/service_name
connection.user: 你的数据库用户名
connection.password: 你的数据库密码
# 新增JDBC连接属性,关闭LOB缓存
connection.properties:
  oracle.jdbc.useFetchSizeWithLongColumn: false
  oracle.jdbc.defaultLobPrefetchSize: 0

参数说明

  • oracle.jdbc.useFetchSizeWithLongColumn: 设置为false会禁用长列(包括CLOB)的预取缓存,避免LOB值被提前释放导致“不存在的LOB值”错误;
  • oracle.jdbc.defaultLobPrefetchSize: 设置为0会关闭LOB预取功能,强制每次读取LOB时直接从数据库获取,不依赖缓存。

如果上述参数不生效,还可以尝试在SQL中显式将JSON聚合结果转为CLOB:

select 
    X,X,X,
    TO_CLOB(JSON_ARRAYAGG(JSON_OBJECT(X,X,X))) as aggregated_json
from ...

优先推荐调整JDBC连接参数,这是从驱动层面解决问题,更适配Kafka Connect的读取逻辑。

内容的提问来源于stack exchange,提问作者Hyry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 03:35:09