菜单

Lucene的并发性安全性以及锁

2019年4月8日 - mg娱乐场www4355com

那里读者能够感到,Lucene的并发性规则和社会中的那么些雅观的习惯以及创建的法国网球国际赛有所相通
之处。大家不肯定非得严峻地遵循这一个规则,然而只要背离那些规则将会促成相应的后果。在现实生活中,违背律法法规大概得锒铛入狱。在采取Lucene时,
违背那几个规则,则会损坏你的目录文件。Lucene使用者或许会对并发性有荒唐的领悟甚至误用,但Lucene的成立者们对此早已有所预料,由此他们经过
锁机制尽或者地制止应用程序对索引造成意外的磨损。本书将在二.九.三节中对Lucene索引的锁机制实行更进一步的介绍。

 

查找

读文档

添加

删除

优化

合并

查找

 

 

 

 

 

 

读文档

 

 

 

 

 

 

添加

 

 

 

×

 

 

删除

 

 

×

 

×

×

优化

 

 

 

×

 

 

合并

 

 

 

×

 

 

write.lock
文件用于阻止进程试图并发地修改3个目录。越来越纯粹地说,IndexWriter对象在实例化时收获write.lock文件,直到IndexWriter
对象关闭之后才刑满释放。当IndexReader对象在剔除、复苏删除文档或设定域规范时,也急需获得那个文件。因而,write.lock会在对索引入行写操作时间长度期地锁定索引。

— 
IndexWriter对象在对索引举行优化时,IndexReader对象不能够从内部删除文书档案。

— 
Index里德r对象在从索引中除去3个文书档案时,IndexWriter对象无法向里面添加文书档案。

就如大家从前提到的,Lucene的初学者们有时对这一章中介绍的并发性未有很好领会,从而陷
入到本小节中关系的有关锁的难题里,以至在程序中出现了地方所示的那么些。在您的应用程序中借使出现了类似的要命,而索引的一致性对用户而言又12分最重要,那
么请不要满不在乎那几个格外。与锁相关的可怜经常是误用了Lucene
API的八个标明;若在应用程序中现身了那种尤其,应该妥贴地拍卖它们。

mg娱乐场www4355com,在Lucene
中,锁机制是与并发性相关的一个大旨。在一如既往时刻只同意实施单一进程的具备代码段中,Lucene都制造了依照文件的锁,以此来防止误用Lucene
的API造成对索引的毁坏。各样索引都有其自作者的锁文件集;在暗中同意的图景下,全体的锁文件都会被创设在微型计算机的近日目录中,那么些目录由Java的
java.io.tmpdir中的系统品质所钦命。

 

表2.三 使用同2个IndexWriter或IndexReader实例时的产出操作矩阵,表中打叉的壹部分代表两个操作无法同时实施

依照上述的并发性规则,大家能够协会一些关于并发性的更完美的例证,如表二.第22中学所示。表中说明了是不是允许大家对三个目录文件进行各个并发性的操作。

锁机制的实例


任意数量的只读操作都能够而且进行。例如,两个线程或进程能够并行地对同贰个目录进行搜索。

虽说知道Lucene使用了如何锁文件,几时、为啥要运用它们,以及在文件系统的何地存放那么些锁文件,不过你不能够直接在文件系统对它们进行操作。你应有经过
Lucene的API对它们进行操作。不然,要是未来Lucene开端启用一种不一致的锁机制,或许Lucene改变了锁文件的命名或存款和储蓄地点时,应用程序
只怕会遭受震慑而无法顺畅举办。

那部分剧情将介绍七个紧凑联系的核心:索引文件的出现访问、IndexReader和IndexWriter的线程安全性,以及Lucene用于制止索引被
破坏而选用的锁机制。平常,Lucene的初学者们对这多少个大旨都存在一定的误解。而标准地领悟这一个内容是不行重点的,因为,当索引应用程序同时服务于多量不一致的用户时,或为了满意壹些偶然的请求、而急需经过对壹些操作进行并行处理时,这一个内容会赞助你解除在营造应用程序过程中所遭遇的疑难。

Lucene
提供了部分修改索引的章程,例如索引新文档、更新文书档案和删除文书档案;在实践那个操作时,为了制止对索引文件造成损坏,要求依据一些一定的平整。那类难点通常会在web应用程序中显出出来。因为web应用程序是同时为两个请求而服务的。Lucene的并发性规则就算相比简单,但大家必须严酷依据:

从地方的矩阵及其归结中,大家能够收获这么三个利用情势:当IndexWriter对象在对索
引实行改动操作时,IndexReader对象不能够对索引举行修改。这么些操作情势是对称的:当IndexReader对象正在对索引实行修改操作
时,IndexWriter对象同样也不能够对索引举行改动。

一经在目录文书档案时,观看一下不胜一时半刻目录,就足以看到Lucene的write.lock文
件;在段(segment)进行联合时,还是能够看看
commit.lock文件。你能够因此设定org.apache.lucene.lockDir中的系统本性,使锁文件存放的目录改至内定的地方。那几个系统品质能够经过利用Java
API在程序中实行设定,还足以由此命令行实行设定,如:-Dorg.apache.lucene.lockDir=
/path/to/lock/dir。若有多台总计机要求拜访存款和储蓄在共享磁盘中的同一个目录,则应当在先后中显式地设定锁目录,那样位于差别电脑上的应
用程序才能访问到互相的锁文件。依照已知的锁文件以及互联网文件系统(NFS)现身的题材,锁目录应该选取放在3个不重视于互连网的文件系统卷上。以下正是下面提到的三个锁文件:

—  IndexReader的isLocked(Directory)
——那一个法子能够判定参数中钦点的目录是不是业已被上锁。在想要对索引进行某种修改操作从前,应用程序须要检讨索引是还是不是被锁尊敬时,通过运用那一个措施能够很有益地获得结果。

当对段展开读或联合操作时,就要求用到commit.lock文件。在IndexReader
对象读取段文件在此之前会获得commit.lock文件,在那几个锁文件中对具备的索引段实行了命名,唯有当IndexReader对象已经打开并读取完全体的段后,Lucene才会自由这一个锁文件。IndexWriter对象在创造新的段在此之前,也急需得到commit.lock文件,并直接对其开展爱戴,直
至该指标执行诸如段合并等操作,并将对事情没有什么益处的目录文件移除实现之后才假释。因此,commit.lock的创建恐怕比write.lock更为频仍,但
commit.lock决无法过短时间地锁定索引,因为在这些锁文件生存期内,索引文件都不得不被打开或删除,并且唯有一小部分的段文件被写入磁盘里。表
2.4对Lucene 中各个应用Lucene API来锁定索引的动静展开了回顾。

二.九.三  索引锁机制


在目录正在被涂改时,大家也足以同时实施任意数量的只读操作。例如,当有个别索引文件正在被优化,或正在对索引执行文书档案的丰硕、更新或删除操作时,用户还是能对这一个目录进行检索。

其壹矩阵能够归纳为:

注:当正在修改三个索引时,请牢记在某暂时时,在同2个目录上只好举行3个改动操作。

图贰.七  2个IndexWriter或IndexReader对象能够被多个线程所共享

—  Index里德r的unlock(Directory)
——该格局的效益正如其命名这样。即使通过这么些措施能够使您在自由时刻对轻易的Lucene索引进行解锁,可是它的行使全体一定的危险性。因为
Lucene创造锁自有其理由,此外,在修改二个目录时对其解锁只怕引致那些目录被毁坏,从而使得那几个目录失效。

二.玖.肆  禁止使用索引锁

操    作

是否允许

对同一个索引运行多个并行的搜索进程

允许

对一个正在生成、被优化或正在与另一索引合并的索引运行多个并行的搜索进程,或该索引正在进行删除、更新文档等操作时,对索引运行多个并行的搜索进程

允许

对同一个索引用多个IndexWriter对象执行添加、更新文档的操作

不允许

当一个从索引中删除文档的IndexReader对象没有成功关闭时,打开一个IndexWriter对象用于在这个索引中添加新的文档

不允许

IndexWriter对象向索引中添加新文档后,未成功关闭;在此之后,打开一个IndexReader对象用于从这个索引中删除文档

不允许

固然Lucene不容许行使三个IndexWriter或IndexReader实例同时对3个索引举办改动,如表贰.二所示,可是那七个类都是线程安全
(thread-safe)的,领会那或多或少一定重大。因而,那五个类的实例都足以被十2线程共享,Lucene会对各种线程中具有对索引实行改动的方法的调
用举行适当的一路处理,以此来保障修改操作能二个随之1个地有序开始展览。图二.7叙述了如此的2个现象:

— 
IndexWriter对象在对索引进行联合时,IndexReader对象也无法从在那之中删除文档。

二.九.二  线程安全性

请小心其余四个与锁相关的法子:

锁文件

何时获取

何时释放

描述

write.lock

IndexWriter

构造函数

close()

在关闭IndexWriter对象时释放锁

write.lock

IndexReader

delete(int)

close()

在关闭IndexReader对象时释放锁

write.lock

IndexReader

undeleteAll(int)

close()

在关闭IndexReader对象时释放锁

write.lock

IndexReader

setNorms (int,String,byte)

close()

在关闭IndexReader对象时释放锁

commit.lock

IndexWriter

构造函数

构造函数

段信息被读取或写入后立即释放锁

commit.lock

IndexWriter

addIndexes (IndexReader[])

addIndexes (IndexReader[])

写入新的段时获取锁文件

commit.lock

IndexWriter

addIndexes (Directory[])

addIndexes (Directory[])

写入新的段时获取锁文件

commit.lock

IndexWriter

mergeSegment (int)

mergeSegments (int))

写入新的段时获取锁文件

commit.lock

IndexReader

open(Direcory)

Open(Direcory)

所有段被读取后获取锁文件

commit.lock

SegmentReader

doClose()

doClose()

段的文件被写入或重写后获取锁文件

commit.lock

SegmentReader

undeleteAll()

undeleteAll()

移除段.del文件后获取锁文件

表二.三是二个有关并发操作的矩阵,它向大家来得了一些具体操作是还是不是能并发地执行。该表假定应
用程序只行使了三个IndexWriter或IndexReader实例。请留意,在此大家并不曾将对索引的翻新视为贰个独立的操作列出,因为它实际能够被用作是在剔除操作后再拓展贰个添加操作。

二.玖.一  并发访问的规则

为了演示锁是怎么着运用的,程序二.七演示了Lucene怎么样行使锁来幸免在相同时刻对同一索引
文件进行多少个修改操作。在testWriteLock(
)方法中,Lucene对三个业已被IndexWriter对象打开的目录上锁,阻止第一个IndexWriter对象对那个目录进行修改。


在某权且时,只允许实施3个修改索引的操作。也正是说,在同一时半刻间,3个索引文件只好被1个IndexWriter或IndexReader对象打开。

表二.二  是还是不是同意对有个别Lucene索引进行并发性操作的比方

大家强烈地建议读者不要对Lucene的锁机制举行随机改动,不要置若罔闻与锁相关的十一分。可是在
1些情形下,你可能想禁止使用Lucene个中的锁机制,并且那样做不会毁掉索引文件。例如,应用程序大概要求拜访存款和储蓄在CD-ROM上的Lucene索引。
因为CD是1种只读介质,那表示应用程序对索引的操作也是只读格局的。换句话说,该应用程序只行使Lucene来搜索索引而不必要对索引举行别的方式的
修改。就算Lucene已经将锁文件保留在系统的暂且目录(那个目录常常能够被系统的有所用户打开以用来写操作)中,不过你仍是可以够透过将
disableLuceneLocks那一个系统个性设定为“true”,从而禁用write.lock和commit.lock文件。

应用程序不供给展开额外的1起处理。固然IndexReader和IndexWriter那三个类都以线程安全的,使用Lucene的应用程序依旧必须保障那四个类的指标对索引的改动操作不能重叠。也正是说,在选用IndexWriter对象将新
文书档案被增八月索引中在此以前,必须关闭全部曾经完毕在同3个索引上,举行删除操作的IndexReader实例。同样地,在IndexReader对象对索引
中的文书档案进行删减和换代此前,必须关闭从前已经开辟该索引的
IndexWriter实例。

表二.四  Lucene中有所锁及成立和释放锁的操作

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图