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