一个索引由多个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

09-11 20:52