Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading ConcurrentUpdateSolrClient如何处理更新请求?_Multithreading_Solr_Solrj - Fatal编程技术网

Multithreading ConcurrentUpdateSolrClient如何处理更新请求?

Multithreading ConcurrentUpdateSolrClient如何处理更新请求?,multithreading,solr,solrj,Multithreading,Solr,Solrj,我的申请打算定期向Solr插入文件。有两个考虑因素: 向Solr发送更新请求是影响性能的关键因素。 线程安全的事务。SolrClient的提交不是线程安全的。请指出,如果我错了,当多个用户向Solr输入文档时,这可能会导致严重的问题。 我发现ConcurrentUpdateSolrClient是一个候选解决方案,它是线程安全的,并且它有一个队列来缓冲和刷新一个连接中的多个文档。但当我测试它时,我感到困惑。我的问题是, 如果设置了队列大小,是否仍需要提交? 如果我提交,即使队列中只有一个文档,它仍

我的申请打算定期向Solr插入文件。有两个考虑因素:

向Solr发送更新请求是影响性能的关键因素。 线程安全的事务。SolrClient的提交不是线程安全的。请指出,如果我错了,当多个用户向Solr输入文档时,这可能会导致严重的问题。 我发现ConcurrentUpdateSolrClient是一个候选解决方案,它是线程安全的,并且它有一个队列来缓冲和刷新一个连接中的多个文档。但当我测试它时,我感到困惑。我的问题是,

如果设置了队列大小,是否仍需要提交? 如果我提交,即使队列中只有一个文档,它仍然会向Solr提交http请求。我可以让它作为消息队列工作吗? SolrClient是线程安全的,如果您的insert/update/delete坚持到Solr实例中的一个集合或核心,那么您可以跨多个线程共享SolrClient实例

但是Solr没有像您可以想象的那样在经典RDBMS中拥有事务

您必须知道,如果同一个应用程序或不同的应用程序和服务器中有更多SolrClient实例同时更新集合/核心,则向该集合/核心发送提交的第一个客户端将提交每个客户端在此之前完成的所有更新

另一方面,如果SolrClient实例发送回滚,它将回滚所有更新,即使是由其他SolrClient客户端完成的更新

有许多策略可以同时更新Solr中的文档,为了理解提交在Solr中的工作原理,我强烈建议您阅读

如果您正在编写自己的多线程应用程序,我只建议将提交和回滚集中在一个点上

缓冲所有添加的文档并写入它们 打开HTTP连接。这个类是线程安全的

虽然 任何SolrClient请求都可以通过此实现进行,它是 仅建议将ConcurrentUpdateSolrClient与/update一起使用 请求。HttpSolrClient类更适合查询 接口


非常感谢你的推荐。我了解什么是软提交和硬提交。最重要的想法是不要做任何类型的客户提交-Erick Erickson。我很高兴看到我的答案是有用的: