1

我正在使用 Jena 和 Tomcat 开发一个 Web 应用程序,我发现通常在抛出异常之后,TDB 会发生一些事情,并且某些从模型中检索数据的调用会导致此 execption:

org.openjena.atlas.lib.InternalErrorException: Invalid id node for subject (null node): ([00000000000010D2], [000000000000003D], [0000000000000072])
    at com.hp.hpl.jena.tdb.lib.TupleLib.triple(TupleLib.java:130)
    at com.hp.hpl.jena.tdb.lib.TupleLib.triple(TupleLib.java:116)
    at com.hp.hpl.jena.tdb.lib.TupleLib.access$000(TupleLib.java:45)
    at com.hp.hpl.jena.tdb.lib.TupleLib$3.convert(TupleLib.java:77)
    at com.hp.hpl.jena.tdb.lib.TupleLib$3.convert(TupleLib.java:73)
    at org.openjena.atlas.iterator.Iter$4.next(Iter.java:301)
    at com.hp.hpl.jena.util.iterator.WrappedIterator.next(WrappedIterator.java:80)
    at com.hp.hpl.jena.util.iterator.Map1Iterator.next(Map1Iterator.java:47)
    at com.hp.hpl.jena.util.iterator.WrappedIterator.next(WrappedIterator.java:80)
    at com.hp.hpl.jena.rdf.model.impl.StmtIteratorImpl.next(StmtIteratorImpl.java:45)
    at com.hp.hpl.jena.rdf.model.impl.StmtIteratorImpl.nextStatement(StmtIteratorImpl.java:55)
    at com.example.myApp (myApp.java:123)

为什么这种情况不断发生 - 我在每个 doPost/doGet 方法的末尾调用 model.close() 。大多数时候它似乎工作,只有当出现问题并且服务器在开发过程中崩溃或抛出某些异常时,我才会遇到这个问题。

遇到这个问题后,是否有任何方法可以恢复或者是将三重存储的定期备份保存在文件中然后再次重新读取它们的唯一方法?

提前致谢。

4

1 回答 1

1

此问题的常见原因是并发更新。TDB 访问应在写入期间对其他写入者读取者进行锁定。您可以通过使用transactions或使用应用程序级锁定来自己执行 MRSW 策略来做到这一点。您提到doPost/doGet方法中出现问题:大多数 Web 服务器通过线程池处理传入请求,因此即使您自己不使用线程,您也可能通过该路由访问存储并发。

还要确保跟踪最新的 Jena 版本。偶尔会有一些错误修复可以解决索引损坏问题,但据我所知,目前没有报告未解决的问题。您可以随时查看 Jena JIRA以查看是否有任何相关的未解决问题,或者,如果您有可重现的测试用例,请开新票。

通常,不应发生索引损坏。但是,最好将备份和数据恢复内置到您的架构中,就像您对任何其他数据源所做的那样。我不知道如何破坏索引。

于 2012-07-24T09:31:15.123 回答