我已经google了很多.大多数问题都是由JVM崩溃后留下的锁引起的.这不是我的情况.
我有一个包含多个读者和作者的索引.我正在尝试进行批量索引更新(删除和添加 - 这就是lucene更新的方式).我正在使用solr的嵌入式服务器(org.apache.solr.client.solrj.embedded.EmbeddedSolrServer).其他编写者正在使用远程非流式服务器(org.apache.solr.client.solrj.impl.CommonsHttpSolrServer).
我启动了这个大规模的更新,它运行了一段时间,然后死了一个
引起:org.apache.lucene.store.LockObtainFailedException:Lock获取超时:NativeFSLock @/.../lucene-ff783c5d8800fd9722a95494d07d7e37-write.lock
我在solrconfig.xml中调整了锁定超时
<writeLockTimeout>20000</writeLockTimeout>
<commitLockTimeout>10000</commitLockTimeout>
Run Code Online (Sandbox Code Playgroud)
我即将开始阅读lucene代码来解决这个问题.任何帮助,所以我不必这样做会很棒!
编辑:我的所有更新都通过以下代码(Scala):
val req = new UpdateRequest
req.setAction(AbstractUpdateRequest.ACTION.COMMIT, false, false)
req.add(docs)
val rsp = req.process(solrServer)
Run Code Online (Sandbox Code Playgroud)
solrServer 是org.apache.solr.client.solrj.impl.CommonsHttpSolrServer,org.apache.solr.client.solrj.impl.StreamingUpdateSolrServer或org.apache.solr.client.solrj.embedded.EmbeddedSolrServer的实例.
另一个编辑:我停止使用EmbeddedSolrServer,现在可以使用了.我有两个单独的进程来更新solr搜索索引:
1)Servlet 2)命令行工具
命令行工具使用的是EmbeddedSolrServer,它最终会因LockObtainFailedException而崩溃.当我开始使用StreamingUpdateSolrServer时,问题就消失了.
我仍然有点困惑,EmbeddedSolrServer可以工作.有人可以解释一下吗.我认为它会对Servlet进程起到很好的作用,并且在另一个写入时它们会等待.