My question is very simple, When use IndexReader.openIfChanged (reader) replace the previous reader, How to safely the close oldReader?
Here is the code: (Use 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
}
This code in a deamon thread,Every 5 seconds run time
IndexReader instance(reader object) is globally unique
Since this change, I get an 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 using the reader object(IndexReader instance,globally unique)
IndexManager.query method has a large number of concurrent requests, all requests to use a globally unique IndexReader instance (reader object)

I need to close oldReader just because:
- Too many open files in Lucene Indexing when number of users
increase - Lucene Wiki:Too many open files
Reference:
How do I solve this problem?
Look at NRTManager and SearcherManager. You really don’t have to handle this yourself.