2009-05-11 2 views
0

私は自分のLuceneコードの行をしました:。私のfinally節で閉会indexreader

try 
{ 
    searcher.GetIndexReader(); 
} 
catch(Exception ex) 
{ 
    throw ex; 
} 
finally 
{ 
    if (searcher != null) 
    { 
     searcher.Close(); 
    } 
} 

、私はsearcher.Close()、それはまたsearcher.GetIndexReaderを(実行されます)を実行したときに閉じる舞台裏?

またはsearcher.GetIndexReader()を明示的に呼び出す必要がありますか?閉じる()メソッドを使用してIndexReaderを閉じますか?

読んでいただきありがとうございます。

答えて

2

ご迷惑をおかけしますが、の検索者の種類とその構成方法を理解するのは難しいです。しかし、あなたははインデックスリーダーを閉じるべきではないsearcher.GetIndexReader()。閉じる()searcher.Close()は、それに関連付けられたすべてのリソースとインデックスリーダーも閉じます。IFサーチャがありません IndexSearcher(IndexReader r)で構成されたIndexSearcherインスタンスです。その場合は、手動でインデックスリーダーを閉じる必要があります。

+0

感謝: サーチャ=新しいIndexSearcher(myIndexDir);この場合はそう、どのようにインデックスリーダーを閉じる必要がありますか? –

+0

ディレクトリからサーチャーを作成している場合は、サーチャーを終了するだけで十分です。それは内部的に読者を閉じます。 –

+0

お返事ありがとうshashikant! –

1

まず第一に、このようなコードは常に悪い考えです:

try { 
    // Do something 
} catch(Exception ex) { 
    throw ex; // WRONG 
} 

あなただけの例外のソースをマスキングし、まだ投げています。これらの行を削除するほうがよい。

IndexReaderを自分で作成していない場合は、自分で閉じる必要はありません。方法getIndexReaderをまったく使用する必要がない可能性が高いです。

ブロック内のsearcherに割り当てている場合を除き、ヌル値を取得する方法がないため、ヌルであるかどうかを確認する必要はありません。

ここにあなたのコードがどのように見えるかの例を示します。このように、サーチャーを作成しています...ウルコメントの

String myIndexDir = "/my/index/dir"; 

IndexSearcher searcher = new IndexSearcher(myIndexDir); 
try { 
    // Do something with the searcher 
} finally { 
    searcher.close(); 
} 
関連する問題