2012-02-02 95 views
3

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

+1

更好的解决方案是只使用一个服务器进程来写入,并让每个人都经历这个过程。如果你的并发性很低(即几乎不需要等待),你的方法就没有问题。也许看看Solr吧。 – Thilo 2012-02-02 06:48:47

+0

@Thilo你的意思是多线程共享一个IndexWriter? – 2012-02-02 08:02:09

+0

是的,就像一个数据库连接池(除了它是一个池)。如果这是同一个JVM中的多个线程(并且没有其他进程写入索引),则可以执行现在的操作,并仅对这些线程进行同步。 – Thilo 2012-02-02 08:05:39

回答

2

单个Directory不能被多个IndexWriters共享。只需在您的线索中共享一个IndexWriter即可。

0

IndexWriter完全是ThreadSafe,所以它的多线程操作是安全的,但是你不能在同一个索引上有多个IndexWriter。

+0

IndexReader怎么样?使用IndexWriter的某些应用程序添加文档时如何安全地从索引中读取数据? – zeppaman 2016-08-30 06:26:31