Bur*_*ong 2 multithreading solr solrj
我的应用程序打算定期向 Solr 插入文档。有两个考虑因素:
我发现了ConcurrentUpdateSolrClient一种候选解决方案,它是线程安全的,并且它有一个队列可以在一个连接中缓冲和刷新许多文档。但当我测试它时我很困惑。我的问题是,
它SolrClient是线程安全的,SolrClient如果您的插入/更新/删除坚持到 Solr 实例中的一个集合或核心,您可以跨多个线程共享一个实例。
但 Solr 没有您想象的经典 RDBMS 中的事务。
您必须注意,如果您有多个SolrClient实例(在同一应用程序中或在不同的应用程序和服务器中)同时更新集合/核心,则向该集合/核心发送提交的第一个客户端将提交所有已完成的更新,直到该更新完成。每个客户的时刻。
另一方面,如果SolrClient实例发送回滚,它会回滚所有已完成的更新(甚至由其他 SolrClient 客户端完成)。
在 Solr 中并发更新文档有很多策略,要了解 Solr 中的提交如何工作,我强烈建议阅读
如果您正在编写自己的多线程应用程序,我只是建议将提交和回滚集中在一个点上。
ConcurrentUpdateSolrClient缓冲所有添加的文档并将它们写入打开的 HTTP 连接。这个类是线程安全的。尽管可以使用此实现发出任何 SolrClient 请求,但仅建议将 ConcurrentUpdateSolrClient 与 /update 请求一起使用。HttpSolrClient 类更适合查询接口。