Lucene的多线程访问原则和同步,锁机制

重装系统后,恢复Oracle的.ORA文件 前几天,系统莫名奇妙产生很多宏病毒,进而感染整个C盘,不得已,格式化后重装了系统。 重装系统之后,突然想到D盘中的oracle中很多数据没导出来备份,安装文件下有很多有用的.ORA文件,抱着死马当活马医的态度,居然成功了。 1、将原来D盘(D:\oracle\product\10.2.0\oradata\orcl)下的数据文件备份下其他盘,将D盘的oracle目录名改成oracle1。安装数据 阅读详情

 

本文介绍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进行删除时上锁

 

Qt QTableView排序 在开发过程中,我们需要通过点击表头来对QTableView或QTreeView等一系列高级视图进行排序操作,以下是进行排序的步骤。首先创建了一个QStandardItemModel对象或者继承QAbstractTableModel类作为数据模型,并设置了一些数据。然后创建一个QTableView对象,并将数据模型设置为其模型。接下来,创建一个QSortFilterProxyModel对象,并将QStandardItemModel对象设置为其源模型。然后设置QTableView开启排序功能。 阅读详情

相关推荐

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

一步一步跟我学习lucene是对近期做lucene索引的总结,

Lucene多线程操作实现

对于并发,Lucene 遵循以下规则: [list] [*]1. 允许任意多的读操作并发,即任意数量用户可同时对同一索引做检索操作。 [*]2. 即便正在进行索引修改操作(索引优化、添加文档、删除文档),依然允许任意多的检索操作并发执行。 [*]3. 不允许并发修改操作,也就是说同一时间只允许一个索引修改操作。 [/list] Lucene内部已经对多线程安全进行了处理,很多操...

ds590的专栏 334

中国历史文化名城、名镇、名村数据.rar

“历史文化名城”是指保存文物特别丰富,具有重大历史文化价值革命意义的城市。这些城市通常拥有悠久的历史、丰富的文化遗产独特的城市风貌。中国历史文化名镇是由住房城乡建设部国家文物局共同组织评选的,保存文物特别丰富,且具有重大历史价值或纪念意义的,能较完整地反映一些历史时期传统风貌地方民族特色的镇。中国历史文化名村是指保存文物特别丰富且具有重大历史价值或者革命纪念意义的村。这些村庄通常拥有悠久的历史独特的文化风貌,是乡村文化的重要组成部分。中国历史文化名城、名镇、名村以及传统村落的数量之多、分布之广、价值之高,都令人叹为观止。这些宝贵的文化遗产不仅是我们民族的骄傲,更是我们传承发扬中华优秀传统文化的重要基础。让我们共同珍惜这些文化遗产,让它们在新时代焕发出更加绚丽的光彩!格式:shp、excel;;;;Wgs1984指标名称、省份、批次、经度、纬度

解决Lucene多线程并发问题

Lucene程序中,成功以上面的方式创建IndexWriter对象以后,会在索引库中出现一个文件,这个文件是当前这个IndexWriter的,如果调用indexWriter.close()关闭了链接,则将会把这个文件删除,也就是说,它释放了。释放以后,第二个IndexWriter再开启是没有问题的。如果不关闭,同时开了两个或以上的IndexWriter,会抛出一个异常。导致程序终止。

您已进入防沉迷系统... 7018

Lucene 索引的并发读写

lucene能够很好地支持多线程/进程 访问。 1.并发读 一个索引可以被多个进程的IndexReader打开。一个进程中,推荐IndexReader被单例多线程使用。 IndexReader类不仅是线程安全的,还是线程友好的,即友好地支持并发访问,代码中同步代码(synchronized)块并不多。 2.单独写 对于一个索引来说,一次只能打开一个In...

weixin_33852020的博客 559

Lucene多线程访问原则同步,加锁机制

<br />本文介绍lucene多线程环境下的使用原则commit.lock与write.lock实现的锁机制。<br />设计之初就是服务于多线程环境,大多数情况下索引会被不至一个线程访问。索引时一个关键资源。在对这样的资源进行访问时,不可避免地会出现同步访问 的问题。因此需要有很好的策略来处理这些并发访问,以保证资源的合理使用。对索引的非法访问可能导致索引数据异常,进而毁坏重要的数据,导致整个系统的失 败。<br />下面是索引访问原则:<br />1.在同一时刻,lucene索引中允许有一个进程对

1843

lucene多线程并发的问题

Lucene多线程访问原则同步,锁机制 2012-03-28  真爱图书  文章来源  阅 805  转 5 转藏到我的图书馆分享到微信 本文介绍lucene多线程环境下的使用原则commit.lock与write.lock实现的锁机制。 设计之初就是服务于多线程环境,大多数情况下索引会被不至一个线程访问。索引时一个关键资源。在对这样的

北漂码农 3089

Lucene5学习之多线程创建索引

    昨晚睡觉前把多线程创建索引demo写好了,今天早上7点多就起来,趁着劲头赶紧记录分享一下,这样对那些同样对Lucene感兴趣的童鞋也有所帮助。     我们都知道LuceneIndexWriter在构造初始化的时候会去获取索引目录的写writerLock,加的目的就是保证同时只能有一个IndexWriter实例在往索引目录中写数据,具体看截图:  而在多线程环境下,光保证只有...

嘿↗你的益达 718

lucene索引写入读取机制

创建脚本 1.PRIMARY KEY(主键索引) mysql&amp;amp;amp;gt;ALTER TABLE table_name ADD PRIMARY KEY ( column ) 2.UNIQUE(唯一索引) mysql&amp;amp;amp;gt;ALTER TABLE table_name ADD UNIQUE (column ) 3.INDEX(普通索引) mysql&amp;amp;amp;gt;ALTER..

tinysakura的博客 1197

lucene-线程安全性

1、lucene不允许使用多个IndexWriter或IndexReader实例同时对一个索引进行修改。但这2个类都是线程安全的2、2个类的实例都可以被多线程共享,Lucene会对各个线程中所有对索引进行修改的方法的调用进行恰当的同步处理,以保证修改操作能一个接一个有序进行。3、恰当的处理是指保证这2个类的对象对索引的修改操作不能重叠,使用IndexWriter对象将新文档增加到索引之

深未来技术 539

Lucene.net索引文件的并发访问线程安全性

通常,Lucene的初学者们对Lucene.net索引文件的并发访问、IndexReaderIndexWriter的线程安全性存在一定的误解。而准确地理解这些内容是十分重要的。此文简单的论述下这两个问题。并发访问的规则 Lucene提供了一些修改索引的方法,例如索引新文档、更新文档删除文档;在执行这些操作时,为了避免对索引文件造成损坏,需要遵循一些特定的规则。这类问题通常会在web应用程序中...

weixin_33843409的博客 139

Lucene同步法则

避免出现同步问题:       1、在同一时刻,Lucene的索引只允许有一个进程对其进行加入文档、删除文档、更新索引等操作。       2、在同一时刻,Lucene的索引允许多个线程同时对其进行检索。 也即:       1、任一时刻,在系统中只能有一个IndexWriter的实例对索引进行操作不允许有多个IndexWriter向索引添加Document,或是优化索引、合并segmen...

Tonny 244

lucene多线程索引

lucene中存在的两种,  第一种, 针对每个索引文件目录有一个, 该保证了只有一个IndexWriter实例写该目录 第二种, 在每个IndexWriter实例下, 有一个ThreadState对象池, 默认大小为8(该对象池也被称为线程池, 但实际上他只是一个池), 具体参见点击打开链接   lucene多线程索引可以分为三类,  第一种, 单线程单目录索引, 该方式只会...

atarik@163.com 1293

Lucene6入门教程(七)多目录多线程索引/检索

在使用lucene6 的时候,会遇到多目录多线程的索引构建检索(查询)情况。把不同类型的数据放到同一个索引文件中,这是不现实的,而且,除了内存索引,创建多目录索引也能提高索引速度,这是因为,一个索引目录只能有一把,那如果有多个索引目录,每个索引目录发一把,N个索引目录同时进行索引写操作就有意义了。而检索的时候,也需要多线程并发来提高搜索速度。以上,就可以用到多目录多线程问题了,本文主要参考so

大漠帝国的博客 2615
上一篇: python 字符串使用总结
下一篇: solr中集成中文分词 mmseg4j
Java2King
博客等级 码龄18年 221粉丝 77原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值