索引由多个IndexWriters共享。显然,如果开放索引即将由其他IndexWriter打开,则会抛出LockObtainFailedException
。
我的解决方案是使用长超时创建IndexWriter:
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...");
}
对于这种情况有更好的解决方案吗?
编辑:受Thilo的启发。我找到了IndexWriter的JavaDoc:IndexWriter实例完全线程安全,这意味着多个线程可以同时调用其任何方法。如果您的应用程序需要外部同步,则不应在IndexWriter实例上进行同步,因为这可能会导致死锁;使用你自己的(非Lucene)对象。
答案 0 :(得分:3)
多个Directory
无法共享单个IndexWriters
。只需在您的主题中共享一个IndexWriter
。
答案 1 :(得分:0)
IndexWriter完全是ThreadSafe,因此对其进行mutlthread操作是安全的,但是你不能在同一个索引上拥有多个IndexWriter。