2009-05-11 3 views
0

내 루씬 코드 라인을했습니다. 내 마지막 절에서닫기 indexreader

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

, 나는 searcher.Close(), 또한 searcher.GetIndexReader을 (실행한다)을 실행할 때 닫기 뒤에서 ?

또는 searcher.GetIndexReader()를 명시 적으로 호출해야합니까? Close() 메서드를 사용하여 IndexReader를 닫습니다.

읽어 주셔서 감사합니다.

답변

2

죄송합니다. 수취인의 유형과 구성 방법을 이해하기가 어렵습니다. 하지만 이 아니어야합니다. searcher.GetIndexReader(). 닫기(). searcher.Close()은 해당 자원과 인덱스 판독기를 모두 닫습니다. IF searcher is not IndexSearcher (IndexReader r)으로 구성된 IndexSearcher 인스턴스입니다. 이 경우 인덱스 리더를 수동으로 닫아야합니다.

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

당신은 단지 예외의 원인을 마스킹, 여전히 던지고있다 : 모든

+0

감사 : 여기

은 당신의 코드가 어떻게 보일지의 예 수색자 = 새로운 IndexSearcher (myIndexDir를) 어떻게이 경우에는 너무 인덱스 리더를 닫을까요? –

+0

디렉토리에서 searcher를 작성하는 경우 searcher를 닫는 것으로 충분합니다. 그것은 내부적으로 독자를 닫을 것이다. –

+0

ur 답변을 주셔서 감사합니다 shashikant! –

1

첫째,이 같은 코드는 항상 나쁜 생각이다. 그 라인들을 지우는 것보다 낫다.

IndexReader을 직접 만들지 않았다면 직접 닫지 않아도됩니다. 가능성이 높기 때문에 getIndexReader 메서드를 사용할 필요가 없습니다.

또한 블록 내의 searcher에 할당하지 않으면 null 값을 얻을 수있는 방법이 없으므로 null인지 여부를 확인할 필요가 없습니다. 이 같은 수색자 만드는 오전 ... 통해 UR 의견

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

IndexSearcher searcher = new IndexSearcher(myIndexDir); 
try { 
    // Do something with the searcher 
} finally { 
    searcher.close(); 
}