我的问题很简单,当用IndexReader.openIfChanged (reader)
替换以前的reader
时,如何安全关闭oldReader
?如何安全关闭IndexReader?
下面是代码:(利用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
}
这段代码在一个后台程序线程,每5秒运行时间
IndexReader
实例(reader
对象)是全球唯一
由于这种变化,我得到一个例外:
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
使用reader
对象(IndexReader
例如,全局唯一的)
IndexManager.query
方法具有大量的并发请求,所有请求使用一个全局唯一IndexReader
实例(reader
对象)
我需要关闭oldReader
只是因为:
- Too many open files in Lucene Indexing when number of users increase
- Lucene Wiki:Too many open files
参考:
我该如何解决这个问题?
确定读者在致电openIfChanged之前没有关闭吗? – vikas 2012-07-08 12:17:43
什么是并发设置?如果可以同时执行此代码,则可能会有许多问题。无论如何,你不应该自己实现这个,因为Lucene已经[提供自己的SearcherManager](http://lucene.apache.org/core/old_versioned_docs/versions/3_5_0/api/core/org/apache/lucene/search/ SearcherManager.html)。 – 2012-07-08 12:58:42
@vikas我的问题描述了错误,我必须修改和重写问题 – Koerr 2012-07-08 14:50:44