2011-01-18 9 views
5

Ci scusiamo per la semplice domanda, ma non sembra esserci alcun modo ovvio. Secondo la documentazione, si consiglia di conservare una singola istanza di IndexWriter in memoria che possa essere utilizzata più e più volte per gli aggiornamenti, anziché aprirla e chiuderne una per ogni modifica (che è molto più costosa).Come posso verificare se un'istanza di Lucene IndexWriter è valida/aperta?

Tuttavia, la documentazione indica anche che IndexWriter deve essere chiuso se si verifica un'eccezione (ad esempio OutOfMemoryException).

Pertanto, ho bisogno di un modo per verificare se la mia istanza di IndexWriter è valida o meno, supponendo che potrebbe essere chiusa da qualche altra operazione.

Mi rendo conto che otterrò un'eccezione se provo ad usarlo quando è chiuso, ma piuttosto che fallire, vorrei verificare se ho bisogno di creare un nuovo IndexWriter prima che ne abbia bisogno quindi non si verifica alcun errore.

Mi sembra un semplice IsOpen proprietà/metodo sarebbe un'aggiunta così ovvia.

Pensieri:

suppongo che se avessi potuto garantire che la mia classe è l'unica cosa in grado di chiudere il IndexWriter, potrei semplicemente impostarlo a null quando è stato chiuso e basta controllare per assicurarsi che sia non null ogni volta che vado a utilizzarlo, tuttavia questo non gestirà i casi in cui lo IndexWriter si chiude da solo (se tale caso è possibile ora o in futuro).

Un'altra idea è che potrei avvolgere un tentativo di usarlo in un blocco try/catch e usare l'eccezione per indicare che deve essere riaperto, ma questo non sembra molto efficiente/elegante. Quale metodo utilizzerei per testare la validità dello IndexWriter?

risposta

3

Se si ottiene un'eccezione di memoria (o qualsiasi tipo di eccezione, in realtà), che è potenzialmente un grosso problema. Le modifiche che stavi cercando di scrivere probabilmente non verranno scritte e il tuo indice potrebbe persino essere corrotto, a seconda di quando/come si è verificata l'eccezione.

Quindi uno IndexWriter in uno stato di errore è una circostanza eccezionale, e direi che sicuramente garantisce l'utilizzo di eccezioni, ad esempio try/catch.

(Non credo che la tua cattura sarebbe "riaprire lo scrittore." A seconda dell'eccezione, potrebbe essere necessario reindicizzare roba, possibilmente da zero. Certamente non dovresti aspettarti di ottenere eccezioni nel tuo scrittore come evento normale).

1

Suppongo che lo IndexWriter lanci uno AlreadyClosedException (vedere ensureOpen), se è chiuso all'accesso. Quindi puoi gestirlo nel caso in cui lo IndexWriter non sia null.

HTH

Problemi correlati