Как я могу проверить, является ли экземпляр Lucene IndexWriter действительным / открытым? - PullRequest
5 голосов
/ 18 января 2011

Извините за простой вопрос, но, похоже, не существует очевидного пути. Согласно документации, рекомендуется хранить в памяти один экземпляр IndexWriter, который можно использовать снова и снова для обновлений, а не открывать и закрывать его для каждого изменения (что намного дороже).

Однако в документации также указывается, что IndexWriter следует закрывать в случае возникновения исключения (например, OutOfMemoryException).

Поэтому мне нужен какой-то способ проверить, действителен ли мой экземпляр IndexWriter или нет, при условии, что он может быть закрыт другой операцией.

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

Мне кажется, простое IsOpen свойство / метод было бы таким очевидным дополнением.

Мысли:

Полагаю, что если бы я мог гарантировать, что мой класс - единственное, что способно закрыть IndexWriter, я мог бы просто установить его на null, когда он был закрыт, и просто проверить, чтобы он не был null всякий раз, когда Я использую его, однако это не касается случаев, когда IndexWriter закрывается сам (если такой случай возможен сейчас или в будущем).

Другая мысль состоит в том, что я мог бы обернуть попытку использовать его в блоке try / catch и использовать исключение, чтобы указать, что его нужно открыть, но это не кажется очень эффективным / элегантным. Какой метод я бы использовал, чтобы проверить действительность IndexWriter?

Ответы [ 2 ]

3 голосов
/ 19 января 2011

Если вы получаете исключение нехватки памяти (или вообще любое исключение), это потенциально большая проблема.Изменения, которые вы пытались записать, вероятно, не будут записаны, и ваш индекс может даже быть поврежден, в зависимости от того, когда / как произошло исключение.

Так что IndexWriter, находящийся в состоянии сбоя, является исключительнымобстоятельства, и я бы сказал, это, безусловно, оправдывает использование исключений, то есть try / catch.

(Я не думаю, что ваш улов будет «открыть писателя». В зависимости от исключения вам может понадобиться переиндексировать материал, возможно, с нуля. Конечно, вы не должны ожидать, что исключения будут в вашем писателе.как обычное явление.)

1 голос
/ 19 января 2011

Полагаю, IndexWriter выдаст AlreadyClosedException (см. sureOpen ), если он закрыт при доступе. Таким образом, вы можете справиться с этим, если IndexWriter не null.

НТН

...