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
相关产品推荐
相关产品推荐

