同时写Lucene索引

时间:2012-02-02 06:37:52

标签: java lucene

索引由多个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)对象。

2 个答案:

答案 0 :(得分:3)

多个Directory无法共享单个IndexWriters 。只需在您的主题中共享一个IndexWriter

答案 1 :(得分:0)

IndexWriter完全是ThreadSafe,因此对其进行mutlthread操作是安全的,但是你不能在同一个索引上拥有多个IndexWriter。