`
ahuaxuan
  • 浏览: 638159 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

阅读更多

接上文,在上面一篇文章中,我们谈到了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方法中具体做了一些什么事情呢?让我们深入到方法的内部查看一下:

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();
    }
 


在上面的flush中,我们已经看到,只有index.commit()有一点点的神秘感,其他的逻辑ahuaxuan已经写的非常详细了。其实commit就是把这个PersistentIndex对应的indexwriter关闭掉。

总结


从这篇文章(上,下篇)中,我们可以看到delete,add和flush的主要逻辑,那么再简单回顾一下:
1.    Delete:需要把所有可能保存document的地方都检查一遍,有就删除。这些地方包括,


           1)    VolatileIndex中的pendding队列
         2)    VolatileIndex(ramdirectory)中的document的indexdata
         3)    IndexQueue
         4)    PersistentIndex(fsdirectory)



2. Add and Flush:


              1) 创建document
            2) 将document加入到VolatileIndex的pending中
            3) pending 中的document大于10就多线程生产indexdata到ram中
            4) ram中的document的index数据大于100份就新建一个persistentIndex,并把这些数据拷贝到PersistentIndex对应的磁盘目录中。   

 



3 indexNames和deletables这两个变量分别对应两个文件,一个表示有效的索引目录,还有一个表示需要删除的索引目录。在整个update的过程中,PersistentIndex可能会新建,成为一个有效的目录,再后面的合并过程中又可能会被删除,所以用这两个变量来记录有效索引目录和需要被删除的索引目录。

 


通过这篇文章,我们可以得到了两个疑问:


1.    indexqueue到底是怎么使用的?
2.    indexmerger的逻辑是怎么样的?


同样,ahuaxuan将会在后面的文章中阐述这两个话题。
TO BE CONTINUE

分享到:
评论

相关推荐

    深入浅出 jackrabbit 1

    《深入浅出 Jackrabbit 1》 Jackrabbit 是一个开源的、实现了 Java Content Repository (JCR) API 的内容管理系统,它允许程序通过统一的方式访问、存储和管理各种数据,包括文本、图像、视频等多媒体信息。这篇...

    jackrabbit最全入门教程

    这个“jackrabbit最全入门教程”将会带你深入理解这个强大的内容管理解决方案。 首先,我们需要了解什么是JCR。JCR提供了一种统一的方式来访问和管理数字内容,无论这些内容是文档、图像、视频还是其他形式的数据。...

    JackRabbit 学习参考资料总汇

    JackRabbit学习参考资料总汇涉及了深入浅出的JackRabbit内容仓库API的学习,内容涉及多个专题,整个学习资料是PDF文档格式。从标签来看,这份资料主要涉及JackRabbit以及JCR(Java Content Repository)的内容仓库...

    Apache Jackrabbit入门

    Apache Jackrabbit 是一个开源的Java Content Repository (JCR)实现,它是Content Management Systems (CMS)的核心技术之一。JCR是Java Specification Request (JSR) 170和JSR 283定义的标准,旨在提供一个统一的...

    jackrabbit

    在项目实施过程中,尤其是那些需要管理树状结构内容的应用场景下,Jackrabbit 的优势尤为明显。例如,管理主题树、仪表盘树、资源树等,并处理它们之间的关联。 #### 二、关键问题及解决策略 ##### 问题1:JCR存储...

    jackrabbit-standalone-1.5.6.jar jackrabbit 开发包

    jackrabbit 1.5.6 jar

    Jackrabbit入门实例

    在这个"Jackrabbit入门实例"中,你将找到一系列在Eclipse环境下运行的示例项目,帮助初学者快速理解并掌握Jackrabbit的使用。 首先,让我们深入了解一下JCR。JCR是一个接口规范,定义了如何存储、检索和管理半结构...

    Jackrabbit API

    Apache Jackrabbit API 是一个强大的内容管理系统(CMS)的核心组件,它是Apache Software Foundation 开发的Java Content Repository (JCR) 的实现。JCR 是一个标准,它定义了一个用于存储、管理和检索结构化内容的...

    jackrabbit-standalone

    jackrabbit-standalone-1.6.5.jar是webDav的支持jar包。

    查看jackrabbit仓库的小工具

    标题中的“查看jackrabbit仓库的小工具”指的是一个用于观察和管理Apache Jackrabbit仓库的实用程序。Jackrabbit是Java Content Repository (JCR) API的一个开源实现,它提供了一个内容管理系统(CMS)的基础框架,...

    jackrabbit教程

    Apache Jackrabbit 是一个...对于开发人员来说,理解这些功能以及如何将 Jackrabbit 集成到现有应用中是深入学习的关键部分。通过实践示例代码和探索 Jackrabbit API 文档,你可以逐步掌握这个强大的内容管理系统框架。

    jackrabbit-webdav-2.7.1.zip

    标题中的"jackrabbit-webdav-2.7.1.zip"指的是Apache Jackrabbit的一个特定版本——2.7.1的WebDAV模块的压缩包。Apache Jackrabbit是Java内容存储库(Content Repository)的一个实现,它遵循JCR(Java Content ...

    jackrabbit-webdav-2.3.2.src.zip

    在Jackrabbit项目中,"org"下的子文件夹会按照项目模块和类的功能进行划分,例如"org.apache.jackrabbit.webdav"可能是WebDAV相关的主模块,而"org.apache.jackrabbit.webdav.client"可能是客户端实现的代码,"org....

    jackrabbit2.6

    Apache Jackrabbit 2.6 是一个开放源代码的、基于Java的内容管理系统(CMS),它实现了JCR(Java Content Repository)规范,提供了一种用于存储、管理和检索非结构化数据的标准接口。Jackrabbit 提供了一个高性能、...

    jackrabbit jar包

    jackrabbit开发用jar包,jackrabbit是基于Lucene的一种站内搜索技术,它用xml文件为他的元数据,自动穿件索引,使用xpath或者xquery的查询方法。

    jackrabbit内容仓库的实例(两个工程)

    这两个项目将帮助我们深入理解和快速入门Jackrabbit的使用。 1. Jackrabbit核心概念: - JCR:JSR 170定义了内容存储的标准接口,使得应用程序可以透明地访问和操作不同类型的存储系统。 - Node:在JCR中,内容被...

    jackrabbit-api-1.5.0.jar

    jackrabbit-api-1.5.0.jar

    jackrabbit-jcr-commons-2.5.0.zip

    杰克兔(Jackrabbit)是Apache软件基金会的一个开源项目,主要致力于实现Java Content Repository (JCR) 规范。这个规范定义了一种用于存储、管理和检索结构化内容的标准API。在给定的压缩包"jackrabbit-jcr-commons...

    Jackrabbit学习篇

    当应用程序向Jackrabbit提交数据时,数据会被封装成`Item`对象,而`ItemState`则负责将这些`Item`对象转换为可以持久化的状态,并最终将它们保存到数据库或文件系统中。 `ItemState`的持久化过程可以分为三个层次:...

Global site tag (gtag.js) - Google Analytics