私の質問は非常に簡単です、使用するときIndexReader.openIfChanged (reader)
は前のものを置き換えてくださいreader
、安全に閉じる方法はoldReader
?
コードは次のとおりです:(Lucene3.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
instance(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
次の理由だけで閉じる必要があります。
参照:
この問題を解決するにはどうすればよいですか?