簡體   English   中英

Lucene .Net,我需要關閉IndexWriter嗎?

[英]Lucene .Net, do i need to close IndexWriter

我們遇到鎖定問題Lucene .Net拋出一個LockObtainFailedException 它是一個多租戶站點,每個客戶在光盤上獲得自己的物理搜索索引,並使用一個staticIndexWriters列表,每個索引一個控制更改。

我們在IndexWriter上調用以下函數

AddDocument();
DeleteDocuments();
DeleteAll();
Optimize();
Commit();

我注意到我們從不在IndexWriter上調用Close()Dispose() ,並且想知道這是否是好的做法並且可能是問題的原因。

謝謝戴夫

文檔說是,但只有當你殺掉應用程序本身時 - 否則,不行。 這是Lucene.Net 4.8中IndexWriter.Dispose的文檔:

將所有更改提交到索引,等待掛起的合並完成,並關閉所有關聯的文件。

這是一個“緩慢優雅的關閉”,可能需要很長時間......

請注意,這可能是一項代價高昂的操作,因此,請嘗試重新使用單個編寫器,而不是關閉並打開一個新編寫器。 有關某些IO設備執行的寫入緩存的警告,請參閱Commit()

https://github.com/apache/lucenenet/blob/master/src/Lucene.Net/Index/IndexWriter.cs#L996

因此,您應該調用.Dispose() ,但通常只在您關閉應用程序時調用一次。 但是,您是否需要Dispose()其基礎對象並不清楚。

你已經調用了.Commit() ,他們推薦使用它。 我猜你的問題實際上與線程有關。 我只是在學習Lucene,但如果我在你的位置,我會嘗試在Lucene的任何寫調用周圍放置一個標准的.Net鎖,這樣一次只有一個線程可以訪問寫操作。 如果它解決了你的問題,你知道它是線程。

鎖是非常痛苦的,Lucene寫的可能需要很長時間,因此如果鎖解決了這個問題,它可能會引入其他問題,例如2個線程試圖寫入,1個掛起或失敗,具體取決於代碼的編寫方式。 如果確實出現了這種情況,你可能想要實現一個Write Queue,這樣線程就可以快速地將他們想寫的東西移到像ConcurrentQueue這樣便宜的數據結構上,然后讓那些寫操作在沒有運行的情況下啟動寫操作,並且繼續出列直到所有內容都寫完 - 然后再回到睡眠狀態。

當你不再需要這個對象時使用Close / Dispose總是一個好主意。 開發人員公開這些方法的原因是有原因的。 通常,文檔提供了何時使用這些方法的其他提示。

我也建議使用每IDisposeable -object在using -塊,這只是調用Dispose()

這使對象能夠清理和釋放資源。 在框架對象的情況下,這並不重要,因為垃圾收集器遲早會關心,但是在系統對象或文件系統句柄之類的句柄的情況下, Dispose變得很重要。 這些手柄可能保持打開狀態

在Lucene IndexWriter的情況下,我並不完全確定,但是當它使用一個文件作為索引時(這是我假設的),那么你就有理由調用Dispose

當句柄/連接/等保持打開時,它可能導致此類異常。 所以,是的,你應該使用Close() / Dispose()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM