2012-07-09 67 views
0

我在一個SAN(共享區域網絡)上有一個Lucene索引,它由多個lucene實例使用,分佈在多臺機器上。當更新索引時,lucene的一個實例會說增加或更新文檔,它會讓我的nativeFSLock,這使得他人無法在同一時間寫入,這工作正常!用lucene.net鎖定索引

問題是,我希望能夠發送批處理更新任何lucene實例,並且我希望它能夠執行所有更新,然後釋放鎖。在Lucene.net中沒有addDocuments方法,只有AddDocument。所以我必須循環遍歷所有文檔並一次添加一個文檔。只要添加一個文檔lucene就會釋放該鎖,然後爲下一個文件創建一個新鎖。所以如果有人在同一時間試圖更新或添加文檔,那麼它有時會在很短的時間內成功獲得鎖,並且只有一些批處理會發生(競爭條件)。

我想獲得一個鎖,而不是釋放它直到我的整批完成,有什麼建議嗎?

問候

回答

0

不要使用NativeFSLockFactory存儲在SAN上的索引,或者使用專用的節點來寫入到索引。

嘗試使用SimpleFSLockFactory並查看它是否可以解決您的鎖定問題。但是對於SimpleFSLockFactory,可能會出現另一個問題,如果您的進程在持有鎖的同時崩潰,則會導致它鎖定在後面。

更多細節在這裏: http://lucene.apache.org/core/old_versioned_docs/versions/2_9_4/api/all/org/apache/lucene/store/NativeFSLockFactory.html

我建議你測試在上面的鏈接中指定的鎖定測試工具環境。 (VerifyingLockFactory,LockVerifyServer和LockStressTest)

+0

謝謝你,一個很好的答案,請仔細閱讀! – najk 2012-07-10 07:41:44

+0

您給我的鏈接是針對NativeFSLockFactory的Java文檔,是否確定它與.net版本的問題相同?我不相信.net版本使用java.io .. – najk 2012-07-10 07:44:20

+0

另一個問題是,我不能使用專用節點來寫,寫操作可能會來到我的任何Web服務,這是分佈式的,我不能依靠單點故障,這些服務不會相互講話,而且完全是無狀態的。 – najk 2012-07-10 07:55:57