使用JENA和Tomcat从TDB损坏中恢复

时间:2012-07-23 18:49:16

标签: tomcat servlets jena triplestore

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

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()。它大多数时候似乎都有效,只有当出现问题并且服务器在开发过程中崩溃或抛出某些异常时才会遇到这个问题。

遇到这个问题,有没有办法恢复或是唯一的方法来保持文件中的三重存储的定期备份,然后再次重新读取它们?

提前致谢。

1 个答案:

答案 0 :(得分:1)

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

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

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