2011-01-18 8 views
5

Disculpe la simple pregunta, pero no parece haber ninguna manera obvia. De acuerdo con la documentación, se recomienda mantener una sola instancia de IndexWriter en memoria que pueda usarse una y otra vez para las actualizaciones, en lugar de abrir y cerrar una para cada cambio (que es mucho más costoso).¿Cómo puedo verificar si una instancia de Lucene IndexWriter es válida/abierta?

Sin embargo, la documentación también indica que el IndexWriter se debe cerrar si se produce una excepción (por ejemplo, OutOfMemoryException).

Por lo tanto, necesito alguna forma de comprobar si mi instancia de IndexWriter es válida o no, suponiendo que pueda cerrarse con alguna otra operación.

realizo que conseguiré una excepción si trato de usarlo cuando está cerrado, pero en lugar de fallar, me gustaría comprobar para ver si necesito para crear un nuevo IndexWriter antes de lo necesario que para que se produzca ningún fallo.

Me parece que una propiedad/método simple de IsOpen sería una adición tan obvia.

Pensamientos:

supongo que si yo podría asegurar que mi clase es el único capaz de cerrar la IndexWriter, yo podría simplemente configurarlo para null cuando estaba cerrado y sólo comprobar para asegurarse de que es no null cada vez que voy a usarlo, sin embargo esto no manejaría casos donde el IndexWriter se cierra solo (si tal caso es posible ahora o en el futuro).

Otra idea es que podría envolver un intento de usarlo en un bloque try/catch y usar la excepción para indicar que debe volver a abrirse, pero esto no parece muy eficiente/elegante. ¿Qué método usaría para probar la validez del IndexWriter?

Respuesta

3

Si se obtiene una excepción de memoria insuficiente (o cualquier tipo de excepción, en realidad), que es potencialmente un gran problema. Los cambios que intentaba escribir probablemente no se escribirán, y su índice incluso puede estar dañado, dependiendo de cuándo y cómo se produjo la excepción.

Así que un IndexWriter estando en un estado de falla es una circunstancia excepcional, y yo diría que ciertamente garantiza el uso de excepciones, es decir, try/catch.

(No creo que tu problema sea "volver a abrir el escritor". Dependiendo de la excepción, es posible que tengas que reindexar cosas, posiblemente desde cero. Ciertamente no deberías esperar excepciones en tu escritor como ocurrencia regular.)

1

supongo que el IndexWriter lanzaría un AlreadyClosedException (ver ensureOpen), si está cerrado el acceso. Para que pueda manejar eso en caso de que el IndexWriter no sea null.

HTH

Cuestiones relacionadas