我的应用程序打算定期向Solr插入文档。有两个考虑因素:
1.向Solr发送更新请求是影响性能的关键因素。
1.事务的线程安全。SolrClient的提交不是线程安全的(如果我错了,请指出这一点),当多个用户向Solr输入文档时,这可能会导致严重的问题。
我发现ConcurrentUpdateSolrClient
是一个候选的解决方案,它是线程安全的,并且它有一个队列来缓冲和刷新一个连接中的许多文档。但是当我测试它时,我感到困惑。我的问题是,
1.如果我设置了队列大小,我还需要提交吗?
1.如果我提交,即使队列中只有一个文档,它仍然会向Solr提交一个http请求。我可以让它作为消息队列工作吗?
1条答案
按热度按时间ovfsdjhp1#
SolrClient
是线程安全的,如果您的插入/更新/删除被固定到Solr示例中的一个集合或核心,您可以跨多个线程共享SolrClient
示例。但是Solr没有您可以想象的经典RDBMS中的事务。
您必须注意,如果您有多个
SolrClient
示例(在同一个应用中或在不同的应用和服务器中)同时更新集合/核心,则第一个向该集合/核心发送提交的客户端将提交每个客户端在该时刻之前完成的所有更新。另一方面,如果
SolrClient
示例发送回滚,它将回滚所有已完成的更新(甚至是其他SolrClient客户端的更新)。在Solr中有许多策略可以同时更新文档,要了解Solr中的提交是如何工作的,我强烈推荐阅读
如果你正在编写自己的多线程应用程序,我建议你把提交和回滚集中在一个点上。
ConcurrentUpdateSolrClient
缓冲所有添加的文档,并将它们写入打开的HTTP连接。此类是线程安全的。**虽然任何SolrClient请求都可以通过此实现发出,但只建议将ConcurrentUpdateSolrClient与/update请求一起使用。**类HttpSolrClient更适合于查询接口。