Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 并发写入Lucene索引_Java_Lucene - Fatal编程技术网

Java 并发写入Lucene索引

Java 并发写入Lucene索引,java,lucene,Java,Lucene,一个索引由多个IndexWriter共享。显然,如果一个期初索引即将由其他IndexWriter打开,则将抛出LockActainFailedException。 我的解决方案是创建具有长超时的IndexWriter: IndexWriterConfig conf= new IndexWriterConfig(Version.LUCENE_30, new SimpleAnalyzer (Version.LUCENE_30)); conf.setWriteLockTimeout(30*1000);

一个索引由多个IndexWriter共享。显然,如果一个期初索引即将由其他IndexWriter打开,则将抛出LockActainFailedException。 我的解决方案是创建具有长超时的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)对象

多个
索引编写器不能共享单个
目录
。只需在线程之间共享一个
IndexWriter

IndexWriter是完全线程安全的,因此对其执行多线程操作是安全的,但在同一索引上不能有多个IndexWriter

更好的解决方案是只使用一个服务器进程进行编写,并让每个人都完成。如果您的并发性较低(即几乎不必等待),那么您的方法是可以的。也许可以看看Solr。@Thilo你的意思是多线程共享一个IndexWriter?是的,就像数据库连接池一样(只是它是一个一个的池)。如果这是同一JVM中的多个线程(并且没有其他进程写入索引),您可以像现在这样做,只需同步线程。您甚至不需要同步任何内容,因为
IndexWriter
是线程安全的…那么IndexReader呢?当应用程序的某些部分使用IndexWriter添加文档时,如何安全地读取索引?