lucene源码-lock和directory

来源:互联网 发布:韩国电视直播软件 编辑:程序博客网 时间:2024/05/29 03:12

两种类型的锁:

write.lock 文件用于阻止进程试图并发地修改一个索引。更精确地说,IndexWriter对象在实例化时获得write.lock文件,直到IndexWriter 对象关闭之后才释放。当IndexReader对象在删除、恢复删除文档或设定域规范时,也需要获得这个文件。因此,write.lock会在对索引进行 写操作时长时间地锁定索引。

当对段进行读或合并操作时,就需要用到commit.lock文件。在IndexReader 对象读取段文件之前会获取commit.lock文件,在这个锁文件中对所有的索引段进行了命名,只有当IndexReader对象已经打开并读取完所有 的段后,Lucene才会释放这个锁文件。IndexWriter对象在创建新的段之前,也需要获得commit.lock文件,并一直对其进行维护,直 至该对象执行诸如段合并等操作,并将无用的索引文件移除完毕之后才释放。因此,commit.lock的创建可能比write.lock更为频繁,但 commit.lock决不能过长时间地锁定索引,因为在这个锁文件生存期内,索引文件都只能被打开或删除,并且只有一小部分的段文件被写入磁盘里


lockfactory的继承关系



directory继承关系



打开索引文件夹下所有索引的方式

Directory directory = null;File file = new File(indexPath);Path path = file.toPath();directory = FSDirectory.open(path);

上述的open方法

 public static FSDirectory open(Path path) throws IOException {    return open(path, FSLockFactory.getDefault());  }

上述的FSLockFactory.getDefault()方法返回的fslockfactory实例, (设计模式:单例, 简单工厂), 该工厂用于在需要时创建lock

上述的open方法

public static FSDirectory open(Path path, LockFactory lockFactory) throws IOException {    if (Constants.JRE_IS_64BIT && MMapDirectory.UNMAP_SUPPORTED) {      return new MMapDirectory(path, lockFactory);    } else if (Constants.WINDOWS) {      return new SimpleFSDirectory(path, lockFactory);    } else {      return new NIOFSDirectory(path, lockFactory);    }  }


根据文件系统的类型, 创建对应的directory对象, directory对象中包含的成员变量有索引文件路径和lockfactory

上述nio文件系统的构造方法如下

protected FSDirectory(Path path, LockFactory lockFactory) throws IOException {    super(lockFactory);    Files.createDirectories(path);  // create directory, if it doesn't exist    directory = path.toRealPath();  }

对于不存在的路径会自行创建



原创粉丝点击