一个索引由多个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...");
}
有什么更好的解决方案吗?
编辑:受蒂洛的启发。我发现IndexWriter的JavaDoc:
IndexWriter实例是完全线程安全的,这意味着多个线程可以同时调用其任何方法。如果您的应用程序需要外部同步,则不应在IndexWriter实例上进行同步,因为这可能会导致死锁。使用您自己的(非Lucene)对象。
最佳答案
单个Directory
不能被多个IndexWriters
共享。只需在线程之间共享一个IndexWriter
。