Lucene文檔指出,IndexSearcher和IndexWriter的單個實例應該用於整個應用程序和所有線程中的每個索引。此外,在索引重新打開之前,對索引的寫入操作將不可見。在Lucene中,如何查找IndexSearcher或IndexWriter是否在另一個線程中使用?
所以,我試圖按照這些指南,在一個多線程的設置。 (一些線程編寫,多個用戶線程搜索)。我不想在每次更改時重新打開索引,而是希望讓搜索器實例不超過一定的時間(比如20秒)。
中央組件負責打開索引讀取器和編寫器,並保留單個實例並同步這些線程。我記錄了上次任何用戶線程訪問過IndexSearcher的時間以及它變髒的時間。如果有人需要在20秒後訪問它,我想關閉搜索器並重新打開它。
問題是,我不確定搜索者以前的請求(由其他線程完成)是否已完成,以便我可以關閉IndexSearcher。這意味着如果我關閉並重新打開在所有線程之間共享的單個IndexSearcher實例,則可能會在其他某個線程中同時進行搜索。
更糟糕的是,這裏是理論上可能發生的事情:可以一直在同一時間執行多個搜索。 (假設您有成千上萬的用戶在同一個索引上運行搜索)。單個的IndexSearcher實例可能永遠不會變成免費的,因此它可以被關閉。理想情況下,我想創建另一個IndexSearcher並向它發送新的請求(而舊的請求仍然打開並運行之前請求的搜索)。當在舊實例上運行的搜索完成時,我想關閉它。
什麼是同步IndexSearcher(或IndexWriter)的多個用戶調用close()方法的最佳方法? Lucene是否爲此提供了任何功能/設施,還是應完全由用戶代碼完成(如使用搜索器對線程進行計數,並在每次使用時增加/減少計數)?
有沒有關於上述設計的建議/想法?
,你提出的基本思路是算主動搜索,因爲我已經在我的帖子的結尾寫的。正如我所說的,每次索引變髒時我都不想重新打開,所以應該在上面添加一些計時方法。它實際上接近我打算做的事情,但我想知道是否還有其他Lucene自己提供的關閉索引的東西。 Lucene引擎應該很容易告訴我們是否在另一個線程上發生了某些事情。 – Iravanchi
順便說一句,+1給你的答案,但我在等待更多的想法。我猜代碼有一些同步問題(比如最後的finally塊也應該同步(this)),我建議你修復它們(如果有的話),以防其他人出現並使用代碼。 – Iravanchi
其實這個代碼根據文檔沒問題。它的優良允許多個線程訪問的IndexWriter「注:IndexWriter類實例完全線程安全的,這意味着多個線程可以調用它的任何方法,同時如果你的應用需要外部同步,你不應該在的IndexWriter實例,因爲這可以同步。導致死鎖;改用你自己的(非Lucene)對象。「 – chubbsondubs