[lucene] IndexWriter可以做成单例的吗?
osborn
2009-08-07
最近做的项目里需要用lucene做增量索引,每10分钟更新一次索引。
想问一下大家,IndexWriter有没有必要写成单例的,就是在tomcat启动时生成一个实例,然后一直不关闭它呢?这样做可以降低开销吗? 我只知道IndexReader可以写成单例,在索引变化后reopen一下就行了…… 另外,IndexWriter没有关闭之前,索引里有write.lock,是不是意味着只要不关闭或不解锁,就不能从索引里删除东西呢? 麻烦大家指点一下~ |
|
linliangyi2007
2009-08-07
建议不要,因为生成索引的过程是相对短暂的,但indexwriter的持续打开会造成操作系统IO文件句柄的长期持有。这样做是有风险的,不建议。
最关键的是,这个单例没有实际的意义 |
|
osborn
2009-08-07
有道理……
索引小的时候生成indexwriter很快,不知道索引大了以后会怎么样。 不过write.lock不释放掉的话果然会有问题。 |
|
amigobot
2009-08-08
index writer lock 不释放有什么问题呢? 反正你只能有一个index.
对于文件句柄, index reader也会占用的, 应该也不是很大的开销。 当然Linux上面文件句柄也许问题会严重点。 IndexWriter关掉和打开也是一个开销,index越大, 开销越大。 如果没有多大意义, 还是避免把。 |
|
luckaway
2009-08-14
建议保存起来。不过10分钟索引一次,就算每次都重新初始化,问题也不是很大!
lucene的API明确说明IndexWriter是线程安全的。 |
|
moshalanye
2009-08-24
如果是多线程提速的话,肯定是不要用同一个,分开可以达到简单分布的效果,使用同一个indexwriter 是占用了一个资源锁(该锁是支持分布的文件锁,不同进程可以得到),锁住的是index fold 这个目录,index操作是使用得是事务锁,所以是线程安全的。
|