`
zjkgzl
  • 浏览: 5202 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Lucene 中的同步与线程安全

阅读更多
Concurrency, thread-safety, and locking issues
规则:
1、任何时候都可以对index进行读操作,包括在index做写操作的时候。也就是说搜索什么时候都可以进行
2、多线程操作单个IndexReader和IndexWriter实例的方法时是线程安全的。但多个实例就必须自己做同步操作。而且没有可能出现多个IndexWriter实例。
3、但IndexReader和IndexWriter之间的写操作也存在着冲突。IndexWriter在添加、优化和合并等写操作时会跟IndexReader的删除等写操作冲突。因为是跨对象的冲突,所以Lucene使用了文件锁(这里的文件锁是指用文件作为锁标记而不是把文件变成只读),文件存在即锁存在,文件名是通过index所在的目录的路径加密而成,所以每份index只有一个锁。正是由于使用了这样的锁模型,所以是跨进程(不单单是线程了哦)的锁。IndexWriter在实例化的时候得到锁(创建锁文件),close的时候释放锁,所以当创建完一个IndexWriter之后,根本不能创建第二个。IndexReader在第一次调用写操作方法的时候得到锁,close的时候释放锁,所以IndexReader理论上可以创建多个实例,但当一个IndexReader执行了写操作,其他的IndexReader就不能在执行写操作,且IndexWriter也无法创建,直到那个IndexReader关闭为止。
所以,当要调用IndexWriter的写操作方法之前,最好关闭所有的IndexReader,否则在以后调用IndexReader的写操作方法时,会报错(数据过时,因为Index已经被IndexWriter操作过),当然不关闭也不会影响IndexWriter的写操作。当要调用IndexReader的写操作方法之前,必须关闭IndexWriter,否则无法进行,因为IndexWriter在创建的时候已经获得了锁。
1、创建两个IndexWriter。结果:第二个IndexWriter不能创建
2、创建一个IndexReader,执行其写操作,创建IndexWriter。结果:IndexWriter不能创建
3、创建两个IndexReader,执行其中一个的写操作,再执行另外一个的写操作。结果:第二个写操作不能进行
4、创建IndexWriter和IndexReader,不关闭IndexReader,IndexWriter写操作,IndexReader写操作。结果:IndexWriter可以执行,
IndexReader写操作不能执行。
5、创建IndexWriter和IndexReader,不关闭IndexReader,IndexWriter写操作,关闭IndexWriter,IndexReader写操作。结果:IndexWriter
可以执行,IndexWriter正常关闭,IndexReader写操作不能执行,抛数据过期错误。
6、创建IndexWriter和IndexReader,不关闭IndexWriter,IndexReader写操作。IndexReader不能执行。
分享到:
评论

相关推荐

    lucene索引优化多线程多目录创建索引

    通过对“lucene_multiThreadIndex”压缩包的学习,你将掌握如何在Lucene中实现多线程索引,从而提高大型数据集的索引构建速度。通过实践,你可以更好地理解和应用这些技术,优化你的信息检索系统。

    【重要】Lucene多线程操作实现[定义].pdf

    为了在多线程环境中安全地使用Lucene,开发者应该遵循以下方案: - **Directory和Analyzer的管理**:Directory和Analyzer是线程安全的,所以可以创建单例对象供所有线程共享。这减少了资源的开销,并确保了操作的...

    lucene3.0核心jar包

    8. **多线程支持**:Lucene 3.0 允许在多线程环境中使用,开发者可以利用并发特性来提高索引和搜索的速度,但需要注意同步问题,避免数据竞争。 9. **扩展性**:Lucene 3.0 提供了丰富的API,允许开发者自定义分词...

    lucene-3.6.0

    6. **多线程支持**:Lucene 3.6.0支持多线程索引和查询,通过适当的同步机制保证了并发环境下的正确性。 7. **JAR文件**:Lucene 3.6.0的发布包含了一系列JAR文件,如core库、示例程序、测试工具等,方便开发者直接...

    lucene3.6.jar

    3. 更新管理:当原始数据发生变化时,Lucene提供更新和删除文档的功能,确保索引与数据同步。 4. 扩展性:Lucene支持分布式搜索,通过Solr或Elasticsearch等工具,可以构建大规模的搜索引擎集群。 总的来说,...

    Lucene In Action

    6. **更新与删除**:Lucene提供了动态更新和删除文档的能力,保持索引与源数据同步。 7. **多线程和分布式搜索**:对于大型数据集,Lucene支持多线程索引和分布式搜索,通过Solr或Elasticsearch等工具可以实现更...

    lucene - 副本.zip

    《Lucene:多线程与多目录索引创建详解》 Lucene,作为一个强大的全文搜索引擎库,被广泛应用于各类信息检索系统中。在处理大量数据时,为了提高效率,我们通常会采用多线程和多目录的方式来创建索引。本文将深入...

    lucene做的桌面搜索

    这可能是由于UI线程与搜索线程之间的同步问题,或者界面设计未充分优化导致的。为了解决这个问题,开发者可以考虑使用异步加载策略,将搜索任务放在后台执行,避免阻塞主线程。同时,优化UI组件的绘制和更新,减少...

    Lucene.Net 实现全文检索

    当数据库中的数据发生变化时,对应的索引也需要同步更新。 4. **全文检索**:用户通过统一的输入框提交查询,应用接收到请求后,使用 Lucene.Net 的 `QueryParser` 类构建查询对象。然后,通过 `IndexSearcher` 对...

    Lucene.net2.4.0

    Lucene.NET 2.4.0是对原生Java版Lucene的.NET平台移植,保持了与原版的高度兼容性,同时优化了.NET环境下的性能表现。 **二、主要特性** 1. **跨平台支持**:Lucene.NET 2.4.0支持.NET Framework,同时兼容.NET ...

    lucene.net基本应用(doc)

    - 如果在多个线程中使用 Lucene,需要考虑同步和锁定机制,以避免数据不一致。 - 选择合适的 `Analyzer`,根据实际文本语言和需求进行定制。 - 考虑定期优化索引,尤其是在大量更新后,以保持最佳搜索性能。 - ...

    Lucene.net-4.8.0 -new Bate.rar

    3. **并发控制**:在多线程环境下,正确管理和同步IndexWriter和IndexReader。 4. **缓存策略**:利用字段缓存和查询缓存,减少不必要的计算。 总之,Lucene.Net 4.8.0作为.NET开发者的强大搜索工具,结合源码学习...

    Lucene 开发实例

    7. **多线程与并发**:Lucene 允许在多线程环境中使用,提供了相应的同步机制,以确保在高并发场景下的正确性。 8. **分布式搜索**:通过 Solr 或 Elasticsearch 这样的分布式搜索引擎,可以实现跨节点的索引和搜索...

    Lucene检索

    此外,多线程索引和搜索也是大型项目中常见的需求,可以通过适当的同步机制来实现。 总的来说,Lucene提供了一个强大而灵活的框架,使开发者能够轻松地在Java应用中集成全文搜索功能。通过学习和实践“Lucene检索”...

    lucene.net源码

    8. **多线程与并发控制** - 在多线程环境下,Lucene.NET提供了适当的同步机制,确保在并发操作下数据的一致性和完整性。 9. **分布式搜索** - 虽然本源码主要关注单机实现,但Lucene.NET也能与其他技术(如Solr)...

    多线程搜索引擎java实现源代码

    在多线程环境下,必须处理好资源竞争和同步问题。Java的`synchronized`关键字、`ReentrantLock`等工具可用于控制并发访问。此外,合理设计线程池、缓存策略、批量处理等技术也能提升性能。 **7. 异常处理与日志记录...

    sql 脚本升级的多线程程序

    在数据库管理系统(DBMS)中,升级脚本是确保数据库版本同步的重要工具,特别是在软件迭代频繁的环境中。 描述中的“是写给公司的”暗示这个程序是为特定的企业环境定制的,可能需要处理复杂的业务逻辑和数据迁移。...

    搜索引擎Lucene+Heritrix(第二版)5

    6. **更新与维护**:定期或实时使用Heritrix更新网页,同步更新Lucene索引。 通过《搜索引擎Lucene+Heritrix(第二版)5》这本书,读者可以深入理解搜索引擎的工作原理,并掌握如何利用这些技术搭建自己的搜索引擎...

    基于EntityFrameworkCore和Lucene.NET的全文检索搜索引擎源码

    通常,当有新的数据插入或更新时,系统会同步更新到Lucene索引中。在查询时,如果需要快速全文搜索,可以优先使用Lucene进行检索,找到潜在匹配项后再利用EntityFrameworkCore获取完整的数据。 【应用场景】 1. **...

Global site tag (gtag.js) - Google Analytics