Восстановление после повреждения TDB с помощью JENA и Tomcat

Я разрабатываю веб-приложение, используя Jena и Tomcat, и я обнаружил, что довольно часто, обычно после того, как возникает исключение, что-то происходит с 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)

Почему это происходит? Я вызываю model.close() в конце каждого метода doPost/doGet. В большинстве случаев кажется, что это работает, только когда что-то идет не так, и сервер выходит из строя или выдает определенные исключения во время разработки, я сталкиваюсь с этой проблемой.

Столкнувшись с этой проблемой, есть ли способ восстановить или единственный способ сохранить в файле регулярные бэкапы тройного хранилища, а затем снова их перечитать?

Заранее спасибо.


person ec2011    schedule 23.07.2012    source источник


Ответы (1)


Распространенной причиной этой проблемы являются одновременные обновления. Доступ к TDB должен быть заблокирован от других авторов и от читателей во время записи. Это можно сделать либо с помощью транзакций, либо с помощью блокировки на уровне приложения для самостоятельно применять политику MRSW. Вы упоминаете, что проблемы возникают в методах doPost/doGet: большинство веб-серверов обрабатывают входящие запросы через пул потоков, поэтому у вас может быть параллелизм при доступе к хранилищу через этот маршрут, даже если вы сами не используете потоки.

Также обязательно отслеживайте последние версии Jena. Время от времени вносятся исправления ошибок, которые решают проблемы с повреждением индекса, хотя, насколько я знаю, на данный момент нет сообщений о нерешенных проблемах. Вы всегда можете проверить Jena JIRA, чтобы узнать, есть ли какие-либо актуальные открытые проблемы, или, если у вас есть воспроизводимый тестовый пример, откройте новый тикет.

В общем случае повреждения индекса быть не должно. Однако, вероятно, лучше всего встроить резервное копирование и восстановление данных в вашу архитектуру, как и для любого другого источника данных. Я не знаю способа восстановить индекс.

person Ian Dickinson    schedule 24.07.2012
comment
Спасибо за это. Придется изучить транзакции и/или контроль параллелизма. Есть ли способ удалить индекс и перестроить его? - person ec2011; 24.07.2012
comment
Afaik, единственный способ перестроить индекс - это удалить содержимое каталога TDB и перезагрузить данные. - person Ian Dickinson; 24.07.2012