1

我们正在运行一个 Java 应用程序,它使用 Jena 适配器将数据保存到 Oracle RDF 三元存储。我们的 Oracle 版本是 11gR2。

最近,我们在保存大三元组时出现了这个错误。

ERROR http-bio-8080-exec-4 oracle.spatial.rdf.client.jena.GraphOracleSem:
Could not add triple java.sql.SQLException: 
ORA-22835: Buffer too small for CLOB to CHAR or BLOB to RAW conversion (actual: 5223, maximum: 4000)
        at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:439)
        at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:395)
        at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:802)
        at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:436)
        at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:186)
        at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:521)
        at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:205)
        at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:1008)
        at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1307)
        at oracle.jdbc.driver.OraclePreparedStatement.sendBatch(OraclePreparedStatement.java:3753)
        at oracle.jdbc.driver.OraclePreparedStatement.processCompletedBindRow(OraclePreparedStatement.java:2112)
        at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3444)
        at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3530)
        at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeUpdate(OraclePreparedStatementWrapper.java:1350)
        at oracle.spatial.rdf.client.jena.GraphOracleSem.performAdd(GraphOracleSem.java:3509)
        at oracle.spatial.rdf.client.jena.OracleBulkUpdateHandler.add(OracleBulkUpdateHandler.java:1226)
        at oracle.spatial.rdf.client.jena.OracleBulkUpdateHandler.addIterator(OracleBulkUpdateHandler.java:1257)
        at oracle.spatial.rdf.client.jena.OracleBulkUpdateHandler.add(OracleBulkUpdateHandler.java:1278)
        at oracle.spatial.rdf.client.jena.OracleBulkUpdateHandler.add(OracleBulkUpdateHandler.java:1268)
        at com.hp.hpl.jena.sparql.modify.UpdateProcessorVisitor$1.exec(UpdateProcessorVisitor.java:51)
        at com.hp.hpl.jena.sparql.modify.GraphStoreUtils.action(GraphStoreUtils.java:60)
        at com.hp.hpl.jena.sparql.modify.UpdateProcessorVisitor.visit(UpdateProcessorVisitor.java:48)
        at com.hp.hpl.jena.sparql.modify.op.UpdateInsertData.visit(UpdateInsertData.java:16)
        at com.hp.hpl.jena.sparql.modify.UpdateProcessorMain.execute(UpdateProcessorMain.java:34)
        at com.hp.hpl.jena.update.UpdateAction.execute(UpdateAction.java:253)
        at com.hp.hpl.jena.update.UpdateAction.parseExecute(UpdateAction.java:176)
        at com.hp.hpl.jena.update.UpdateAction.parseExecute(UpdateAction.java:143)
        at com.hp.hpl.jena.update.UpdateAction.parseExecute(UpdateAction.java:105)

如错误所述,它发生在数据字符串大于 4000 个字符时。尽管它没有在错误中指定表/列,但 Oracle 文档建议它应该在内部自动处理:

RDF_VALUE$ 表:

LONG_VALUE: CLOB - 如果词法值的长度大于 4000 字节,则为字符串。否则,此列具有空值。

VALUE_NAME: VARCHAR2(4000) - 这是一个计算列。如果词法值的长度为 4000 字节或更少,则该列的值是 VNAME_PREFIX 列和 VNAME_SUFFIX 列的值的串联。

一些用户没有看到这个错误,尽管他们可能只是没有尝试保存足够大的东西。我们已经尝试清除用户的三重存储模型,这似乎工作了几天,但后来又回来了。

有人对从哪里开始调试有任何提示吗?谢谢你。

4

1 回答 1

3

几年前我遇到了同样的问题。您使用的是哪个版本的耶拿适配器?我有一个补丁解决了这个问题,也许你可以试试看它是否仍然可以在 oracle 支持上使用。这是我收到的指示:

  1. 登录 support.oracle.com,
  2. 然后点击补丁和更新选项卡
  3. 在 Patch Search 面板中,单击 Search 选项卡,在 Patch Name 或 Number 按钮后的文本框中键入 10186312。
  4. 单击搜索按钮。它应该返回一场比赛。
  5. 单击补丁名称 10186312,然后单击下载。
于 2012-10-09T08:43:19.703 回答