本文介绍lucene多线程环境下的使用原则和commit.lock与write.lock实现的锁机制。

设计之初就是服务于多线程环境,大多数情况下索引会被不至一个线程访问。索引时一个关键资源。在对这样的资源进行访问时,不可避免地会出现同步访问 的问题。因此需要有很好的策略来处理这些并发访问,以保证资源的合理使用。对索引的非法访问可能导致索引数据异常,进而毁坏重要的数据,导致整个系统的失 败。

下面是索引访问的原则:

1.在同一时刻,lucene索引中允许有一个进程对其进行加入文档,删除文档,更新索引等操作。

2.在同一时刻,lucene索引允许多个线程同时对其进行检索。

在Lucene中,对索引发生修改的类主要集中在IndexWriter和IndexReader。其中,IndexWriter主要负责对索引的写入和索引的整体的维护,如合并,优化等操作;IndexReader则负责从索引中删除文档。

如果按照上面第一句所说,则可以得出以下结论:

1.任一时刻,在系统中只能有一个IndexWriter的实例对索引进行操作,不允许有多个IndexWriter向索引添加Document,或是优化索引,合并索引。

2.任一时刻,不能有多个IndexReader在执行文档的删除操作。下一个InderReader应当在上一个InderReader执行close方法之后运行。

3.在使用IndexWriter向索引加入文档前,必须先关闭执行删除操作的IndexReader实例。

4.在使用IndexReader删除前,必须先关闭执行添加Document操作IndexWriter的实例。

综合说来,任何对索引发生修改的操作都不能同时发生;或是在上一修改操作未保存的情况下,用新的实例对索引进行下一修改操作。

Lucene锁机制

lucene使用commit.lock

与write.lock实现锁机制。所谓的锁其实是存放于系统临时目录内的一个文件。例如,建立索引时,可以看到一个write.lock存放在临时目录中。又如,当合并索引时,会看到一个commit.lock存放在临时目录中。

那么,这些锁究竟在什么时候会出现呢?正如前面所说到的,Lucene的同步问题只可能发生在对索引进行文档添加,文档删除,合并segment和优化时,因此lucene锁也基本都出现在这时候。

1.write.lock

writer.lock出现在向索引添加文档时,或是将文档从索引中删除时。writer.lock会在indexwriter被初始化时创建,然 后会在调用IndexWriter的close()方法时被释放。另外,会在IndexReader使用delete方法删除文档时创建,并在调用 IndexReader的close()方法时被释放。

2.commit.lock

commit.lock主要与segment合并和读取的操作相关。例如,他出现在IndexWriter的初始化时,但是一旦当segment的 信息被读取完毕,它就会立刻被释放。另外,当调用IndexWriter的AddIndexs()或MergeSegment()方法时,都会生成这个 锁。

事实上,由于有了这两个锁的所有,才使得lucene具有了保护器索引不受非法操作的功能。

建议IndexWriter作为单例模式得到,IndexReader进行删除时上锁

Lucene的多线程访问原则和同步,锁机制的更多相关文章

  1. Android-Java-synchronized同步锁机制&利与弊

    synchronized同步锁机制 定义锁

  2. NET多线程之进程间同步锁Mutex

    Mutex类似于lock.Monitor,都是为了解决多线程环境下,资源竞争导致的访问顺序问题.常见资源竞争有以下情况: 1.单例,如何确保单例: 2.IO文件操作,如果同时又多个线程访问同一个文件会 ...

  3. JAVA同步锁机制 wait() notify() notifyAll()

    wait() notify() notifyAll() 这3个方法用于协调多个线程对共享数据的存取,所以必须在synchronized语句块中使用. wait() 必须在synchronized函数或 ...

  4. .NET面试题解析(07)-多线程编程与线程同步

      系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 关于线程的知识点其实是很多的,比如多线程编程.线程上下文.异步编程.线程同步构造.GUI的跨线程访问等等, ...

  5. .NET面试题解析(07)-多线程编程与线程同步 (转)

    http://www.cnblogs.com/anding/p/5301754.html 系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 关于线程的知识点其实 ...

  6. Java多线程学习——synchronized锁机制

    Java在多线程中使用同步锁机制时,一定要注意锁对对象,下面的例子就是没锁对对象(每个线程使用一个被锁住的对象时,得先看该对象的被锁住部分是否有人在使用) 例子:两个人操作同一个银行账户,丈夫在ATM ...

  7. Linux内核中锁机制之RCU、大内核锁

    在上篇博文中笔者分析了关于完成量和互斥量的使用以及一些经典的问题,下面笔者将在本篇博文中重点分析有关RCU机制的相关内容以及介绍目前已被淘汰出内核的大内核锁(BKL).文章的最后对<大话Linu ...

  8. 大话Linux内核中锁机制之RCU、大内核锁

    大话Linux内核中锁机制之RCU.大内核锁 在上篇博文中笔者分析了关于完成量和互斥量的使用以及一些经典的问题,下面笔者将在本篇博文中重点分析有关RCU机制的相关内容以及介绍目前已被淘汰出内核的大内核 ...

  9. Linux内核中锁机制之原子操作、自旋锁

    很多人会问这样的问题,Linux内核中提供了各式各样的同步锁机制到底有何作用?追根到底其实是由于操作系统中存在多进程对共享资源的并发访问,从而引起了进程间的竞态.这其中包括了我们所熟知的SMP系统,多 ...

随机推荐

  1. OGG常见问题处理

    1403: ORA-01403: No data found 在运行PL/SQL块.存储过程.函数.触发器等,假设须要进行操作的记录没有查询到.则会返回1403的错误 Goldengate中的1403 ...

  2. 《JavaScript 闯关记》之语法

    JavaScript 的语法大量借鉴了 C 及其他类 C 语言(如 Java 和 Perl)的语法.因此,熟悉这些语言的开发人员在接受 JavaScript 更加宽松的语法时,一定会有种轻松自在的感觉 ...

  3. Spring 入门 Ioc-Annotation

    通过对XML版本进行修改:http://www.cnblogs.com/likailan/p/3446821.html 一.导入 Spring 所需要的包 spring-framework-2.5.6 ...

  4. C#中大List的内存分配

    之前在开发中只用到List的时候几乎就是拿过来就用,从来没有考虑过List的内存分配问题,试想一个有10万元素的List的在构造和添加元素时内存是如何变化的呢?在MSDN上关于List的Capacit ...

  5. C++程序设计实践指导1.4正整数转换为字符串改写要求实现

    改写要求1:改为适合处理超长整数 #include <cstdlib> #include <iostream> #include <string> using na ...

  6. [STOI2014]舞伴(dp)

    STOI是汕头OI...无聊翻到了去年的比赛题目,就写然后自己测了一下. 其实我很想吐槽为什么题目名是perm,perm好像和舞伴完全无关.. dp(x,s)=∑dp(x-1,s-{i}))(0< ...

  7. js获取当期日期累加天数

    本文是转载的,,忘记出处了,我用上了,也给大家分享一下 一.日期减去天数等于第二个日期 function cc(dd,dadd)...{//可以加上错误处理var a = new Date(dd)a ...

  8. 使用mysqlbinlog工具进行基于位置或时间点的数据恢复

    使用mysqlbinlog工具进行基于位置或时间点的恢复 MySQL备份一般采取全备份加日志备份的方式,比如每天执行一次全备份,每小时执行一次二进制日志备份.这样在MySQL Server故障后可以使 ...

  9. delete、update忘加where条件误操作恢复过程演示

    update.delete没有带where条件,误操作,如何恢复呢? 我现在有一张学生表,我要把小于60更新成不及格. mysql> select * from student; +----+- ...

  10. oracle中job定时调用存储过程的实例

    使用job模拟定时从元数据表中抽取指定数据进入目标表的过程. 一.创建元数据表 --create table test_origianl create table test_original_data ...