2012-07-09 48 views
0

我在一个SAN(共享区域网络)上有一个Lucene索引,它由多个lucene实例使用,分布在多台机器上。当更新索引时,lucene的一个实例会说增加或更新文档,它会让我的nativeFSLock,这使得他人无法在同一时间写入,这工作正常!用lucene.net锁定索引

问题是,我希望能够发送批处理更新任何lucene实例,并且我希望它能够执行所有更新,然后释放锁。在Lucene.net中没有addDocuments方法,只有AddDocument。所以我必须循环遍历所有文档并一次添加一个文档。只要添加一个文档lucene就会释放该锁,然后为下一个文件创建一个新锁。所以如果有人在同一时间试图更新或添加文档,那么它有时会在很短的时间内成功获得锁,并且只有一些批处理会发生(竞争条件)。

我想获得一个锁,而不是释放它直到我的整批完成,有什么建议吗?

问候

回答

0

不要使用NativeFSLockFactory存储在SAN上的索引,或者使用专用的节点来写入到索引。

尝试使用SimpleFSLockFactory并查看它是否可以解决您的锁定问题。但是对于SimpleFSLockFactory,可能会出现另一个问题,如果您的进程在持有锁的同时崩溃,则会导致它锁定在后面。

更多细节在这里: http://lucene.apache.org/core/old_versioned_docs/versions/2_9_4/api/all/org/apache/lucene/store/NativeFSLockFactory.html

我建议你测试在上面的链接中指定的锁定测试工具环境。 (VerifyingLockFactory,LockVerifyServer和LockStressTest)

+0

谢谢你,一个很好的答案,请仔细阅读! – najk 2012-07-10 07:41:44

+0

您给我的链接是针对NativeFSLockFactory的Java文档,是否确定它与.net版本的问题相同?我不相信.net版本使用java.io .. – najk 2012-07-10 07:44:20

+0

另一个问题是,我不能使用专用节点来写,写操作可能会来到我的任何Web服务,这是分布式的,我不能依靠单点故障,这些服务不会相互讲话,而且完全是无状态的。 – najk 2012-07-10 07:55:57