[导入]Lucene并发访问


作者: yagesi  链接:http://yagesi.javaeye.com/blog/165604  发表时间: 2008年02月27日

声明:本文系JavaEye网站发布的原创博客文章,未经作者书面许可,严禁任何网站转载本文,否则必将追究法律责任!

在Lucene并发访问中,如果出现线程冲突,会造成索引文件的损坏,系统出现Lock obtain timed Out异常. 索引文件的临时目录会多一个work.lock或者commit.lock的文件,证明你并发访问出现了问题,索引文件已经损坏...

在Lucene in Action中给出IndexWriter和IndexReader并发访问操作矩阵,矩阵中描述了两个操作不能同时执行的描述:

矩阵可以归纳为:

 

  • IndexReader对象在从索引中删除一个文档时,IndexWriter对象不能向该索引库添加文档
  • IndexWriter对象在索引进行优化时,IndexReader对象不能从其中删除文档
  • IndexWriter对象在对索引进行合并时,IndexReader对象也不能从其中删除文档

以上三点引自 Lucene in Action 第二章

其实在程序中,到底该索引是否被锁定,我们可以通过IndexReader类的静态方法isLocked(Directory)进行判定..我测试过,如果使用IndexWriter访问索引,那么在我们创建IndexWriter对象的时候,索引文件就会被锁定,当调用IndexWriter的close方法时,锁才释放...当我们使用IndexReader访问索引文件时,当我们使用open打开索引时,文件不会被锁定,只有执行deleteDocument方法时才锁定,IndexReader的close方法时才释放...

所以在并发访问索引文件的时候,我们除了要保证IndexWriter和IndexReader它们各自的并发访问的线程安全外,还要保证IndexWriter和IndexReader之间的并发访问...

 

下面是我实现的部分代码:

 

public class IndexManager {private static Analyzer analyzer = null;private static IndexWriter _company_writer = null;private static IndexReader _company_reader = null;private static List<Thread> _company_writer_thread = new ArrayList();private static List<Thread> _company_reader_thread = new ArrayList();static{Paoding paoding = PaodingMaker.make();analyzer =  PaodingAnalyzer.writerMode(paoding);}private IndexManager(){}public static IndexWriter getCompanyIndexWriter(String path,Boolean isReBuild){synchronized(_company_writer_thread){if(_company_writer==null){try {while(true){if(!IndexReader.isLocked(path)){_company_writer = new IndexWriter(path,analyzer,isReBuild);break;}else{try {Thread.sleep(100);Thread.yield();} catch (InterruptedException e) {e.printStackTrace();}}}} catch (CorruptIndexException e) {e.printStackTrace();} catch (LockObtainFailedException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}if(!_company_writer_thread.contains(Thread.currentThread()))_company_writer_thread.add(Thread.currentThread());return _company_writer;}}public static void closeCompanyIndexWriter(){synchronized(_company_writer_thread){if (_company_writer_thread.contains(Thread.currentThread()))_company_writer_thread.remove(Thread.currentThread());if (_company_writer_thread.size() == 0){if (_company_writer != null){try {_company_writer.close();} catch (CorruptIndexException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}_company_writer = null;}}}}public static IndexReader getCompanyIndexReader(String path){synchronized(_company_reader_thread){if(_company_reader==null){try {while(true){if(!IndexReader.isLocked(path)){_company_reader = IndexReader.open(path);break;}else{try {Thread.sleep(20);Thread.yield();} catch (InterruptedException e) {e.printStackTrace();}}}} catch (CorruptIndexException e) {e.printStackTrace();} catch (LockObtainFailedException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}if(!_company_reader_thread.contains(Thread.currentThread()))_company_reader_thread.add(Thread.currentThread());return _company_reader;}}public static void closeCompanyIndexReader(){synchronized(_company_reader_thread){if (_company_reader_thread.contains(Thread.currentThread()))_company_reader_thread.remove(Thread.currentThread());if (_company_reader_thread.size() == 0){if (_company_reader != null){try {_company_reader.close();} catch (CorruptIndexException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}_company_reader = null;}}}}}
 

  

该类使用静态方法获取IndexWriter和IndexReader对象,在获取方法中,要判断该索引是否被锁定<IndexReader.isLocked(Directory)方法>,该方法主要为了防止IndexWriter和IndexReader它们之间的并发问题,至于IndexWriter和IndexReader它们自己本身的并发访问问题,使用了一个线程集合来进行管理,可以确保获取的访问对象不会出现同步问题.但是获取的IndexWriter或者IndexReader对象,在close的时候,一定要调用IndexManager的closeXXXXXXX()方法,这样线程池才能有效的管理IndexWriter,IndexReader实例线程...

 

Lucene并发访问问题就介绍到这里,由于刚刚开始学写帖子,有很多地方词不达意,表述不清,请大家谅解,我相信:会进步的...谢谢 


本文的讨论也很精彩,浏览讨论>>


JavaEye推荐
  • 快来参加7月17日在成都举行的SOA中国技术论坛
  • JavaEye问答大赛开始了! 从6月23日 至 7月6日,奖品丰厚 !
  • 北京: 千橡集团暨校内网诚聘软件研发工程师
  • Oracle专区上线,有Oracle最新文章,重要下载及知识库等精彩内容,欢迎访问。
  • 搜狐网站诚聘Java、PHP和C++工程师




文章来源:http://yagesi.javaeye.com/blog/165604

转载于:https://www.cnblogs.com/schwarzwald/archive/2008/07/05/1236204.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/379989.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python程序计算给定文本中单词的出现

Given a text (paragraph) and a word whose occurrence to be found in the text/paragraph, we have to find the how many times word is repeated in the text. 给定一个文本 (段落)&#xff0c;其出现在文本/段落被找到的单词 &#xff0c;我们必须找到如何词多次在文本重…

js私有共有成员

在小项目中对于JavaScript使用&#xff0c;只要写几个function就行了。但在大型项目中&#xff0c;尤其是在开发追求 良好的用户体验的网站中&#xff0c;如SNS,就会 用到大量的JavaScrpt&#xff0c;有时JavaScript的工作量胜过了C#&#xff0c;这时写一堆function,就会显得很…

Java——IO(打印流)

1&#xff0c;打印字节流(PrintStream)的概述&#xff1a; 打印流可以很方便的将对象的toString()结果输出并且自动加上换行&#xff0c;而且可以使用自动刷出的模式 System.out就是一个PrintStream&#xff0c;其默认向控制台输出信息 2&#xff0c;使用方式&#xff1a; …

MATLAB中的正态分布检验

要对一组样本进行正态性检验&#xff0c;在MATLAB中&#xff0c;一种方法是用normplot画出样本&#xff0c;如果都分布在一条直线上&#xff0c;则表明样本来自正态分布&#xff0c;否则是非正态分布。 MATLAB中也提供了几种更正式的检验方法&#xff1a;kstest Kolmogorov-Smi…

远控免杀专题(29)-C#加载shellcode免杀-5种方式(VT免杀率8-70)

0x00 免杀能力一览表 几点说明&#xff1a; 1、表中标识 √ 说明相应杀毒软件未检测出病毒&#xff0c;也就是代表了Bypass。 2、为了更好的对比效果&#xff0c;大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。 3、由于本机测试时只是安装了360全家…

kotlin 或 运算_Kotlin程序对两个数字执行算术运算

kotlin 或 运算Here, we are implementing a Kotlin program to perform various arithmetic operations on two numbers. 在这里&#xff0c;我们正在实现Kotlin程序&#xff0c;以对两个数字执行各种算术运算 。 Given two numbers a and b, we have to find addition, sub…

2012.1.15---学习笔记

最近学习实践的内容主要有&#xff1a;1 memcahche的安装、使用&#xff08;为了减少数据库压力而采用的&#xff09;2 linux下的定时任务的配置&#xff0c;crontab3 如何去编写可配置的php程序&#xff08;加载配置文件&#xff09;1 memcahche的安装、使用&#xff08;为了减…

WPF界面设计技巧(2)—自定义漂亮的按钮样式

上次做了个很酷的不规则窗体&#xff0c;这次我们来弄点好看的按钮出来&#xff0c;此次将采用纯代码来设计按钮样式&#xff0c;不需要 Microsoft Expression Design 辅助了。 首先打开 Microsoft Visual Studio 2008 &#xff0c;新建一个WPF项目&#xff0c;在上面随便放几个…

ropgadgets与ret2syscall技术原理

程序&#xff1a; #include <stdio.h> #include <string.h> #include <sys/types.h> #include <unistd.h> #include <sys/syscall.h> void exploit() { system("/bin/sh"); } void func() { char str[0x20]; read(0,str,0x50); } int…

uboot load address、entry point、 bootm address以及kernel运行地址的意义及联系

按各地址起作用的顺序&#xff0c;uboot引导linux内核启动涉及到以下地址&#xff1a; load address&#xff1a;entry point&#xff1a; 这两个地址是mkimage时指定的bootm address&#xff1a;bootm为uboot的一个命令&#xff0c;以此从address启动kernelkernel运行地址&…

Java——集合(Map集合的两种迭代)

一&#xff0c;Map集合的第一种迭代 Map集合的第一种迭代&#xff0c;通过get(key)方法&#xff0c;根据键去获取值 package com.wsq.map;import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set;public class Demo2_Iterator { …

如何使用两个堆栈实现队列_使用两个队列实现堆栈

如何使用两个堆栈实现队列Stack and Queue at a glance... 堆叠和排队一目了然... Stack: 堆栈&#xff1a; The stack is an ordered list where insertion and deletion are done from the same end, top. The last element that entered first is the first one to be del…

接口pk抽象类

作为开发者&#xff0c;谁从来没有陷入过周而复始地争论应该是使用接口还是抽象类&#xff1f;这是一场永无休止的争论&#xff0c;不同阵营的人总是坚定地坚持自己的立场。应当使用接口还是抽象类&#xff1f;对于初学者来说那更是满头雾水。这个问题应该考虑一下几个因素&…

汇编shr命令

右移命令 比如&#xff1a; mov eax,10 shr eax,0x2上面的命令是将eax的值右移两位&#xff0c;怎么左移呢&#xff1f;首先将eax的值转为二进制10------》1010&#xff0c;然后右移两位变成10&#xff0c;所以执行为shr命令&#xff0c;eax的值为十进制的2

iBatis入门和开发环境搭建

iBatis 的优缺点&#xff1a; 优点&#xff1a; 1、 减少代码量&#xff0c;简单&#xff1b; 2、 性能增强&#xff1b; 3、 Sql 语句与程序代码分离&#xff1b; 4、 增强了移植性&#xff1b; 缺点&#xff1a; 1、 和Hibernate 相比&#xff0c;sql 需要自己写&#x…

Python | 程序以字符串长度打印单词

Given a string and we have to split the string into words and also print the length of the each word in Python. 给定一个字符串&#xff0c;我们必须将字符串拆分为单词&#xff0c;并在Python中打印每个单词的长度。 Example: 例&#xff1a; Input:str "Hell…

Java——递归练习

#练习一&#xff1a;从键盘接收一个文件夹路径&#xff0c;统计该文件夹大小 ###分析&#xff1a; ####每句话相当与每一个要求&#xff0c;每一个要求用一个方法去实现 第一个方法 * getDir()* 第一个要求&#xff1a;从键盘接收一个文件夹路径* 1&#xff0c;创建键盘录入对…

C# 里怎样得到当前执行的函数名,当前代码行,源代码文件名。

得到函数名&#xff1a; System.Diagnostics.StackTrace st new System.Diagnostics.StackTrace(); this.Text st.GetFrame(0).ToString(); 得到代码行&#xff0c;源代码文件名&#xff1a; StackTrace st new StackTrace(new StackFrame(true)); Console…

PHP中单引号和双引号的区别

0x01 单引号 单引号里面的内容不会被解释&#xff0c;不管什么内容&#xff0c;都当做字符串处理 <?php$abc1234; $stradc$abc; echo $str;输出 0x02 双引号 双引号里面的内容会被解释&#xff0c;像一些换行&#xff08;\n)、数据元素等都会被解释 <?php$abc1234;…

Eclipse 代码提示无效的解决方法

代码提示一般有两种形势1、点提示无效经常打一个点就能调出该对象可选的方法列表。哪天不灵了&#xff0c;可以这样解决&#xff1a;window->Preferences->Java->Editor->Content Assist->Advanced 上面的选项卡Select the proposal kinds contained in the de…