此文出自网络,针对当前的3.0版本不知道锁机制是否有所改变,有待在实践中验证
本文介绍lucene多线程环境下的使用原则和commit.lock与write.lock实现的锁机制。
设计之初就是服务于多线程环境,大多数情况下索引会被不至一个线程访问。索引时一个关键资源。在对这样的资源进行访问时,不可避免地会出现同步访问 的问题。因此需要有很好的策略来处理这些并发访问,以保证资源的合理使用。对索引的非法访问可能导致索引数据异常,进而毁坏重要的数据,导致整个系统的失 败。
下面是索引访问的原则:
1.在同一时刻,lucene索引中允许有一个进程对其进行加入文档,删除文档,更新索引等操作。
2.在同一时刻,lucene索引允许多个线程同时对其进行检索。
在Lucene中,对索引发生修改的类主要集中在IndexWriter和IndexReader。其中,IndexWriter主要负责对索引的写入和索引的整体的维护,如合并,优化等操作;IndexReader则负责从索引中删除文档。
如果按照上面第一句所说,则可以得出以下结论:
1.任一时刻,在系统中只能有一个IndexWriter的实例对索引进行操作,不允许有多个IndexWriter向索引添加Document,或是优化索引,合并索引。
lucene3.0API:Opening an IndexWriter creates a lock file for the directory in use. Trying to open another IndexWriter on the same directory will lead to a LockObtainFailedException. The LockObtainFailedException is also thrown if an IndexReader on the same directory is used to delete documents from the index.
2.任一时刻,不能有多个IndexReader在执行文档的删除操作。下一个InderReader应当在上一个InderReader执行close方法之后运行。
3.在使用IndexWriter向索引加入文档前,必须先关闭执行删除操作的IndexReader实例。
lucene3.0API:An IndexReader can be opened on a directory for which an IndexWriter is opened already, but it cannot be used to delete documents from the index then.
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进行删除时上锁
分享到:
相关推荐
- **多线程**:理解线程的创建、同步和通信。 - **TCP/UDP**:了解网络协议,掌握基于TCP和UDP的网络编程。 - **AWT和Swing**:学习图形用户界面(GUI)的创建。 - **事件模型**:理解AWT和Swing中的事件监听...
MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...
MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...
MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...
MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...
MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...
MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...
MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...
MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...
MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...
MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...
MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...
MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...
MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...
1个目标文件 摘要:Java源码,图形操作,火焰效果 Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的...
5. **线程安全**:如果文件系统需要支持多用户访问,可能涉及到并发控制,C#提供了锁、Monitor、Mutex等并发控制机制。 6. **元数据**:可能为每个文件或目录存储额外的信息,如创建日期、修改日期、权限设置等,...