我正在开发一个Kafka连接,它使用SQL请求从数据库获取信息。这个sql请求就像一个
select
X,X,X,
JSON_ARRAYAGG(
JSON_OBJECT(
select X,X,X)).
我的问题似乎是在JSON_ARRAYAGG上,它可能超过18k字符。在这种情况下,如果出现两条这样的线,则会抛出以下错误: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.SQLExeption: ORA-22922: nonexistant LOB value at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:509) at ...
我设法有一个类似的结果使用DBeaver和一些帮助,它似乎取消选中“使用缓存的CLOB值”解决了这个问题的工具。
然而,我没有设法在jdbc文档中找到类似的参数,我可以添加到我的Kafka connect yaml来解决这个问题。
有谁知道这个参数是否存在于Oracle JDBC中?
我已经做了什么:我设法减少了SQL请求的返回值的数量,以便隔离两个似乎一起产生问题的值。我设法在DBeaver上重现了这些值的错误(“复制内容时的IO错误”),然后向我解释了DBeaver的解决方案:取消选中“Use Cache for CLOB value”。
我尝试使用blob并要求Kafka connect将其转换为文本,但结果是一样的。
2条答案
按热度按时间wvt8vs2t1#
哪个数据库和JDBC版本?
ORA-22922是在Ask-Tom论坛上提出的,其中有一些与JDBC无关的建议。你能检查一下这个https://asktom.oracle.com/pls/apex/f?p=100:11:::::P11_QUESTION_ID:9543118700346635079吗
xxslljrj2#
我找到了一个解决问题的方法,即使它看起来更像是一个变通的解决方案,而不是使用jdbc参数的修复。
触发此错误的原因是因为使用JSON_ARRAYAGG的my请求是一个子请求,以便在没有检索到数据时保存空值而不是[{}]。
使用subrequest的问题是使用了该高速缓存。
我的解决方案是删除大多数子请求,并在以下情况下使用dbms_lob case管理空值。