lucene: IO/FileNotFoundException:(Too many open files) 查询异常解决

http://stackoverflow.com/questions/6210348/too-many-open-files-error-on-lucene
 
 
 
今天使用lucene的IndexSearcher报这种异常,文件句柄数超多,超过了设置的65535个
 
 
 

问题解决后发现是 IndexSearcher.close()并没有真正的关闭,看来这篇文章后知道的
 
 
 
看了看IndexSearcher的close方法,让我汗颜了
 
 
这样写,才是真正的关闭IndexSearcher的reader,获取reader,最后关闭
IndexSearcher.getIndexReader().close()
 
更彻底的IndexSearcher关闭
if (null != indexSearcher) {
     try {
          IndexReader indexReader = indexSearcher.getIndexReader();
          indexReader.close();
          indexReader = null;
         
          indexSearcher.close();
          indexSearcher = null;
     } catch (IOException e) {
          e.printStackTrace();
     }
}
 
 
以后出现这种问题首先仔细检查自己写的代码打开文件是不是没有正确关闭,程序的话就是这种错误,不是的话,就是系统的原因,加大文件句柄打开数量解决
 
IndexSearcherg关闭改进后,发现句柄数还是没有按照预想的使用完后就关闭的流程走,我觉得不只关闭IndexReader、IndexSearcher,看了 CSDN - lucene使用教程4 --常用类的对象之IndexSearcher这篇文章后,可能实例化IndexReader的Directory也需要关闭,但我没试,等到了穷途末路的时候再去尝试吧
 
现在解决是加大文件打开句柄数,学dzh的机器,将我们的机器有原来设置的65535改为1006154
变通解决
 
搜索ulimit笔记,有记录设置文件打开数量的做法
 
原以为加大文件打开句柄数就能解决问题,但事实结果是没用,到了穷途末路的时候了,尝试关闭目录
Directory dir = FSDirectory.open(indexDirFile);
IndexReader indexReader = IndexReader.open(dir, true);
dir.close();
 
把目录关闭后,打开的索引文件句柄才是真正的关闭了,真正解决了这个问题
 
有这方面的问题解决,答案确实是关闭reader和directory,调用close方法
 
如果使用了reader的reopen方法,会返回一个新的reader,如果这个reader是最新的,跟你保存你的已实例化好的reader不同的话,建议用新reader并且把旧reader关闭,释放资源(打开文件句柄),用reopen可以提高性能,减少实例化一个新的reader需要的I/O
IndexReader.reopen(true);
 
reopen实战代码:

 
   /*
    * 先获取reader,如果索引文件已经变化,关闭当前indexSearcher,然后以重新获取的indexReader
    * 作为参数new一个新的indexSearcher实例
    */
    IndexReader indexReader=indexSearcher.getIndexReader();//获取当前的indexReader
    if(!indexReader.isCurrent()){//判断是否有索引更新
     
      // 如果有索引更新,先关闭当前的indexSearcher
     indexSearcher.close();
     //利用indexReader.reopen()获取新的indexReader,并作为IndexSearcher的参数创建一个新的indexSearcher
     indexSearcher=new IndexSearcher(indexReader.reopen());
    }
 
 
self:
                               if  (!indexReader.isCurrent()) {
                                     try  {
//                                        Directory directory = indexReader.directory();
//                                        directory.close();
//                                        directory = null;
                                          indexReader.close();
                                           // indexReader = null;
                                    }  catch  (Exception e) {
                                           //  TODO  Auto-generated catch block
                                          e.printStackTrace();
                                    }
 
                                    IndexReader newIndexReader = indexReader.reopen( true );
                                    map.put( "IndexReader" , newIndexReader);
//                                  if (newIndexReader != indexReader) {
//                                        map.put("IndexReader", newIndexReader);
//                                  } else {
//                                        map.put("IndexReader", indexReader);
//                                  }
                              }
 

 
有关reader的reopen方法详细的介绍
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值