2012-02-02 54 views
3

索引由多個IndexWriters共享。顯然,如果其他IndexWriter打開索引即將打開,將會拋出LockObtainFailedException。 我的解決方案是用長超時創建的IndexWriter:同時寫入Lucene索引

IndexWriterConfig conf= new IndexWriterConfig(Version.LUCENE_30, new SimpleAnalyzer (Version.LUCENE_30)); 
conf.setWriteLockTimeout(30*1000);//Wait 30 seconds timeout 
try{ 
     IndexWriter writer = new IndexWriter(dir, conf); 
}catch(LockObtainFailedException e){ 
     System.out.println("give up trying..."); 
} 

這種情況下,任何更好的解決辦法?

編輯:靈感來自蒂洛。我發現的IndexWriter的JavaDoc的:

的IndexWriter實例是完全線程安全,這意味着多個線程可以調用它的任何方法,兼任。如果您的應用程序需要外部同步,則不應該在IndexWriter實例上同步,因爲這可能導致死鎖;改用你自己的(非Lucene)對象。

+1

更好的解決方案是隻使用一個服務器進程來寫入,並讓每個人都經歷這個過程。如果你的併發性很低(即幾乎不需要等待),你的方法就沒有問題。也許看看Solr吧。 – Thilo 2012-02-02 06:48:47

+0

@Thilo你的意思是多線程共享一個IndexWriter? – 2012-02-02 08:02:09

+0

是的,就像一個數據庫連接池(除了它是一個池)。如果這是同一個JVM中的多個線程(並且沒有其他進程寫入索引),則可以執行現在的操作,並僅對這些線程進行同步。 – Thilo 2012-02-02 08:05:39

回答

2

單個Directory不能被多個IndexWriters共享。只需在您的線索中共享一個IndexWriter即可。

0

IndexWriter完全是ThreadSafe,所以它的多線程操作是安全的,但是你不能在同一個索引上有多個IndexWriter。

+0

IndexReader怎麼樣?使用IndexWriter的某些應用程序添加文檔時如何安全地從索引中讀取數據? – zeppaman 2016-08-30 06:26:31