在ASP.NET中使用Lucene.Net時,我可以想象一個Web請求可以觸發對索引的更新,而另一個Web請求正在執行搜索。 Lucene.Net是否構建了管理併發訪問的能力,還是我必須管理它,以避免「被其他進程使用」錯誤?Lucene.Net管理多個線程訪問相同的索引,一個索引,而另一個正在搜索?
編輯:閱讀文檔和實驗後,這是我認爲我已經瞭解到:有兩個問題,線程安全性和併發性。多線程是「安全的」,因爲你不能對索引做任何壞事。但是,這是安全的,只需要一個對象同時鎖定索引。第二個對象會出現並拋出異常。因此,您不能讓搜索處於打開狀態,並希望另一個線程中的作者能夠更新索引。如果一個線程忙於更新索引,那麼嘗試創建一個搜索器將會失敗。
此外,搜索者會在打開索引時看到它的索引,因此如果您將它們放在索引中並更新索引,則索引不會看到更新。
我希望我的搜索者看到最新的更新。
我的設計和它似乎工作到目前爲止,我的作家和搜索者共享一個鎖,以便他們不會失敗 - 他們只是等待 - 直到當前寫入或搜索完成。
你能解釋一下你是如何實現鎖的?你使用讀寫鎖還是隻使用一個共享鎖? – 2010-02-15 11:24:18
一個共享鎖。我寫了我所做的: http://ifdefined.com/blog/post/Full-Text-Search-in-ASPNET-using-LuceneNET.aspx – 2010-02-15 14:08:43
你在你的問題中說什麼是錯的:「所以,你可以如果一個線程正在忙於更新索引,那麼嘗試創建一個搜索器將會失敗。「不要讓搜索處於打開狀態,並希望另一個線程中的作者能夠更新索引。 正如其他答案中提到的:「索引編寫器或閱讀器可以在搜索進行時編輯lucene索引文件」,反之亦然。 – 2013-10-20 01:10:21