Ma question est très simple, Lorsque l'utilisation IndexReader.openIfChanged (reader)
remplacer le précédent reader
, Comment fermer en toute sécurité le oldReader
?Comment fermer un IndexReader en toute sécurité?
Voici le code: (utiliser Lucene 3,5)
IndexReader newReader=IndexReader.openIfChanged(reader);
if(newReader!=null){
IndexReader oldReader=reader;
IndexSearcher oldSearcher=searcher;
reader=newReader;
searcher=new IndexSearcher(newReader);
oldSearcher.close();
oldReader.close();//or oldReader.decRef(),result is the same
}
Ce code dans un fil de deamon, toutes les 5 secondes temps d'exécution
IndexReader
instance (objet reader
) est unique au monde
Depuis ce changement, je reçois une exception:
org.apache.lucene.store.AlreadyClosedException: this IndexReader is closed
at org.apache.lucene.index.IndexReader.ensureOpen(IndexReader.java:297)
at org.apache.lucene.index.IndexReader.getSequentialSubReaders(IndexReader.java:1622)
at org.apache.lucene.search.TermQuery$TermWeight.scorer(TermQuery.java:98)
at org.apache.lucene.search.BooleanQuery$BooleanWeight.scorer(BooleanQuery.java:298)
at org.apache.lucene.search.BooleanQuery$BooleanWeight.scorer(BooleanQuery.java:298)
at org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:577)
at org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:517)
at org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:487)
at org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:400)
at org.zenofo.index.IndexManager.query(IndexManager.java:392)
...
IndexManager.java:392
utilisant l'objet reader
(IndexReader
exemple, globalement unique)
procédé IndexManager.query
a un grand nombre de demandes simultanées, toutes les demandes d'utiliser un IndexReader
instance unique global (reader
objet)
I besoin de fermer oldReader
juste parce que:
- Too many open files in Lucene Indexing when number of users increase
- Lucene Wiki:Too many open files
Référence:
Comment puis-je résoudre ce problème?
Etes-vous sûr que le lecteur n'est pas fermé avant l'appel à openIfChanged? – vikas
Et quel est votre paramètre de concurrence? Si ce code peut être exécuté de manière concomitante, il y a beaucoup de choses qui peuvent ne pas fonctionner. Quoi qu'il en soit, vous ne devriez pas l'implémenter vous-même puisque Lucene [fournit déjà son propre SearcherManager] (http://lucene.apache.org/core/old_versioned_docs/versions/3_5_0/api/core/org/apache/lucene/search/ SearcherManager.html). –
@vikas Ma question décrit l'erreur, je dois réviser et réécrire la question – Koerr