【问题标题】:Oracle RDF table throws ORA-22835 error when saving tripleOracle RDF 表在保存三重时抛出 ORA-22835 错误
【发布时间】:2012-04-24 14:31:58
【问题描述】:

我们正在运行一个 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 列值的串联。

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

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

【问题讨论】:

  • 我猜这是 Oracle 的 RDF 存储中的一个错误。
  • 我也猜你没有 T4CTTIoer.java 源代码,对吧? ;-)
  • 你使用的是graph.getBulkUpdateHandler().addInBulk(...)吗?

标签: java oracle rdf jena sqlexception


【解决方案1】:

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

  1. 登录 support.oracle.com,
  2. 然后点击补丁和更新选项卡
  3. 在“补丁搜索”面板中,单击“搜索”选项卡,在“补丁名称”或“编号”按钮后的文本框中输入 10186312。
  4. 单击搜索按钮。它应该返回一个匹配项。
  5. 点击补丁名称 10186312,然后点击下载。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    • 2020-06-22
    • 2015-06-11
    • 1970-01-01
    • 2018-01-15
    • 2015-06-11
    • 2018-09-29
    相关资源
    最近更新 更多