WEB开发网
开发学院软件开发Java 深入浅出 jackrabbit 五 索引提交(下) 阅读

深入浅出 jackrabbit 五 索引提交(下)

 2009-09-17 00:00:00 来源:WEB开发网   
核心提示:接上文,在上面一篇文章中,深入浅出 jackrabbit 五 索引提交(下),我们谈到了update中的Delete和Add下面我们来谈谈第三个大问题,就是flush的逻辑3 什么是flush大家可能已经沉浸于AddNode逻辑而不能自拔了,delete其实是索引目录的一个文件,这个文件中保存着需要被删除的目录,清醒一

接上文,在上面一篇文章中,我们谈到了update中的Delete和Add

下面我们来谈谈第三个大问题,就是flush的逻辑

3 什么是flush

大家可能已经沉浸于AddNode逻辑而不能自拔了,清醒一点,我们再次回到MultiIndex#update看看,有这么一段代码:

if (flush) { 
        flush(); 
      }

不知道是否有人想起flush怎么才能为true呢,当VolatileIndex处理的document超过100的时候,需要把内存中的index数据copy到persistentindex中,这个时候返回true,也就是当VolatileIndex处理的document数量超过100时,就需要执行flush操作,这个就是执行flush的一个前提,不过有一点需要注意的是:flush并不只是在update方法中调用,后面我们会阐述这个问题,请记住这个问题:还有什么操作需要调用flush呢?

那么flush方法中具体做了一些什么事情呢?让我们深入到方法的内部查看一下:

Java代码   

void flush() throws IOException { 
/*注意这里的同步*/ 
    synchronized (this) { 
      // commit volatile index 
/*开启一个内部事务*/ 
      executeAndLog(new Start(Action.INTERNAL_TRANSACTION)); 
/*这里又执行了一遍commitVolatileIndex方法,这个方法的功能我们已经在本文的前半部分详细的分析过了,即把ramdirectory中的数据拷贝到fsdirectory中*/ 
      commitVolatileIndex(); 
 
      // commit persistent indexes 
      /*所有的persistentindex对象在创建完成之后,都会放到indexes这个list中,这个list*/ 
      for (int i = indexes.size() - 1; i >= 0; i--) { 
        PersistentIndex index = (PersistentIndex) indexes.get(i); 
        // only commit indexes we own 
        // index merger also places PersistentIndex instances in indexes, 
        // but does not make them public by registering the name in indexNames 
        if (indexNames.contains(index.getName())) { 
          index.commit(); 
          // check if index still contains documents 
/*如果一个PersistentIndex中已经没有任何一个document的数据,那就代表它已经没有存在的必要了。*/ 
  if (index.getNumDocuments() == 0) { 
            executeAndLog(new DeleteIndex(getTransactionId(), index.getName())); 
          } 
        } 
      } 
      executeAndLog(new Commit(getTransactionId())); 
/*将有效的PersistentIndex写到一个文件中,一旦当机,那么便可以在重启的时候得知哪些目录是有效的索引目录,这样做是为了防止其读取需要被删除的目录*/ 
      indexNames.write(indexDir); 
      
 
      // reset redo log 
      redoLog.clear(); 
 
      lastFlushTime = System.currentTimeMillis(); 
    } 
 
    // delete obsolete indexes 
/* 删除那些需要被删除的索引目录,delete其实是索引目录的一个文件,这个文件中保存着需要被删除的目录,包含小目录合并成大目录之后需要被删掉。 */ 
    attemptDelete(); 
  } 

1 2  下一页

Tags:深入浅出 jackrabbit 索引

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接