索引由多個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)對象。
更好的解決方案是隻使用一個服務器進程來寫入,並讓每個人都經歷這個過程。如果你的併發性很低(即幾乎不需要等待),你的方法就沒有問題。也許看看Solr吧。 – Thilo 2012-02-02 06:48:47
@Thilo你的意思是多線程共享一個IndexWriter? – 2012-02-02 08:02:09
是的,就像一個數據庫連接池(除了它是一個池)。如果這是同一個JVM中的多個線程(並且沒有其他進程寫入索引),則可以執行現在的操作,並僅對這些線程進行同步。 – Thilo 2012-02-02 08:05:39