1

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()を呼び出しています。ほとんどの場合、それは機能しているように見えますが、問題が発生し、サーバーがクラッシュしたり、開発中に特定の例外がスローされたりした場合にのみ、この問題が発生します。

この問題が発生した場合、回復する方法はありますか、それともトリプルストアの定期的なバックアップをファイルに保存してから再度読み込む唯一の方法ですか?

前もって感謝します。

4

1 に答える 1

1

この問題の一般的な原因は、同時更新です。TDBアクセスは、書き込み中に他のライターおよびリーダーからロックする必要があります。これを行うには、トランザクションを使用するか、アプリケーションレベルのロックを使用してMRSWポリシーを自分で適用します。メソッドで問題が発生するとおっしゃっていdoPost/doGetます。ほとんどのウェブサーバーはスレッドプールを介して着信リクエストを処理するため、自分でスレッドを使用していない場合でも、そのルートを介してストアにアクセスする際に同時実行性がある可能性があります。

また、最新のイエナバージョンを追跡するようにしてください。インデックスの破損の問題に対処するバグ修正が時折ありますが、現時点で未解決の問題は報告されていません。いつでもJenaJIRAをチェックして、関連する未解決の問題があるかどうかを確認できます。再現可能なテストケースがある場合は、新しいチケットを開いてください。

一般に、インデックスの破損は発生しないはずです。ただし、他のデータソースの場合と同様に、アーキテクチャにバックアップとデータリカバリを組み込むのがおそらく最善です。インデックスを壊さないようにする方法はありません。

于 2012-07-24T09:31:15.123 に答える