2012-04-24 73 views
1

我们正在运行一个Java应用程序,该应用程序使用Jena适配器将数据保存到Oracle RDF三重存储中。我们的Oracle版本是11gR2。保存重复数据时,Oracle RDF表抛出ORA-22835错误

最近,我们已经得到这个错误在保存一个大的三倍时弹出。

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列的值的串联。

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

有没有人有任何关于从哪里开始调试的提示?谢谢。

+2

我想这是Oracle RDF商店中的一个bug。 – cygri 2012-04-24 15:12:33

+0

我也猜你没有T4CTTIoer.java源代码,对不对? ;-) – castagna 2012-04-25 11:16:44

+0

你使用graph.getBulkUpdateHandler()。addInBulk(...)? – 2012-04-25 20:29:57

回答

3

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

  1. 登录support.oracle.com,
  2. 然后单击补丁补丁中搜索面板&更新选项卡
  3. ,点击后的文本框中搜索选项卡,键入10186312修补程序名称或数字按钮。
  4. 单击搜索按钮。它应该返回一个匹配。
  5. 点击补丁名称10186312,然后点击下载。