微科社区,轻松开发从此开始! 请登陆 免费注册

微科社区

当前位置:首页 > Java平台 > J2EE >

Lucene的并发性安全性以及锁

时间:2017-01-18 03:21  浏览:努力统计中...
这 部分内容将介绍三个紧密联系的主题:索引文件的并发访问、IndexReader和IndexWriter的线程安全性,以及Lucene用于避免索引被 破坏而使用的锁机制。通常,Lucene的初学者们对这几个主题

这 部分内容将介绍三个紧密联系的主题:索引文件的并发访问、IndexReader和IndexWriter的线程安全性,以及Lucene用于避免索引被 破坏而使用的锁机制。通常,Lucene的初学者们对这几个主题都存在一定的误解。而准确地理解这些内容是十分重要的,因为,当索引应用程序同时服务于大 量不同的用户时,或为了满足一些突发性的请求、而需要通过对某些操作进行并行处理时,这些内容会帮助你消除在构建应用程序过程中所遇到的疑问。

2.9.1  并发访问的规则

Lucene 提供了一些修改索引的方法,例如索引新文档、更新文档和删除文档;在执行这些操作时,为了避免对索引文件造成损坏,需要遵循一些特定的规则。这类问题通常 会在web应用程序中突显出来。因为web应用程序是同时为多个请求而服务的。Lucene的并发性规则虽然比较简单,但我们必须严格遵守:

— 任意数量的只读操作都可以同时执行。例如,多个线程或进程可以并行地对同一个索引进行搜索。

— 在索引正在被修改时,我们也可以同时执行任意数量的只读操作。例如,当某个索引文件正在被优化,或正在对索引执行文档的添加、更新或删除操作时,用户仍然可以对这个索引进行搜索。

— 在某一时刻,只允许执行一个修改索引的操作。也就是说,在同一时间,一个索引文件只能被一个IndexWriter或IndexReader对象打开。

基于以上的并发性规则,我们可以构造一些关于并发性的更全面的例子,如表2.2中所示。表中说明了是否允许我们对一个索引文件进行各种并发性的操作。

表2.2  是否允许对某个Lucene索引进行并发性操作的举例

操    作

是否允许

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

允许

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

允许

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

不允许

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

不允许

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

不允许

注:当正在修改一个索引时,请记住在某一时刻,在同一个索引上只能执行一个修改操作。

2.9.2  线程安全性

尽管 Lucene不允许使用多个IndexWriter或IndexReader实例同时对一个索引进行修改,如表2.2所示,但是这两个类都是线程安全 (thread-safe)的,了解这一点相当重要。因此,这两个类的实例都可以被多线程共享,Lucene会对各个线程中所有对索引进行修改的方法的调 用进行恰当的同步处理,以此来确保修改操作能一个接着一个地有序进行。图2.7描述了这样的一个场景:

图2.7  一个IndexWriter或IndexReader对象可以被多个线程所共享

应用程序不需要进行额外的同步处理。尽管IndexReader和IndexWriter这两 个类都是线程安全的,使用Lucene的应用程序还是必须确保这两个类的对象对索引的修改操作不能重叠。也就是说,在使用IndexWriter对象将新 文档被添加至索引中之前,必须关闭所有已经完成在同一个索引上,进行删除操作的IndexReader实例。同样地,在IndexReader对象对索引 中的文档进行删除和更新之前,必须关闭此前已经打开该索引的 IndexWriter实例。

表2.3是一个关于并发操作的矩阵,它向我们展示了一些具体操作是否能并发地执行。该表假定应 用程序只使用了一个IndexWriter或IndexReader实例。请注意,在此我们并没有将对索引的更新视为一个单独的操作列出,因为它实际上可 以被看成是在删除操作后再进行一个添加操作。

顶一下
(0)
0%
踩一下
(0)
0%
------分隔线------
栏目列表
推荐内容