【问题标题】:solr transaction management using solrj使用 solrj 进行 solr 事务管理
【发布时间】:2012-05-29 19:04:32
【问题描述】:

如何使用 Solrj 在 Solr 中处理事务管理?网上没有太多与此相关的文档。但如果有人可以提供与使用 SolrJ 进行事务管理相关的任何链接或信息,我将不胜感激。

【问题讨论】:

  • 你说的是数据库风格的事务管理吗? SolrJ 没有任何意义。没有回滚,并且提交通过 Web 服务调用发送到 SOLR,因此它们在那里排队,并且不存在并发访问问题的风险(来自内存)。你在使用嵌入式 SOLR 吗?
  • 是的,我想知道当对 Solr 和数据库进行多次读写时,如何使用 solrj 实现 DB 样式的事务管理。我们使用 Hibernate 进行数据库事务管理。如果 Solr 或数据库出现异常,则需要回滚数据库提交和 solr 提交。根据我的理解,看起来这个事务管理需要使用 SolrJ api 全部编写在代码中以进行提交和回滚。如果还有其他更好的方法可以做到这一点,请告诉我。谢谢。
  • 返回您在 SO 上提出的问题,看看他们是否有您认为“正确”的答案,如果有,请用绿色勾号图标将其标记为正确。您现在的比率为 75%,这还不错,所以也许您已经这样做了...
  • 这个答案可能很有趣:stackoverflow.com/a/6737063/249327。似乎我错了,SolrJ 确实有回滚。

标签: transactions solr solrj


【解决方案1】:

对于 Solr 和事务,您必须牢记的是没有隔离。 Solr 不像我们大多数数据库开发人员所习惯的那样支持事务。

提交使所有客户端的所有未决更改对新查询可见。同样,回滚会回滚所有客户端的所有未决更改。零考虑哪个客户端发送了提交/回滚命令。

因此,错误处理不应自动导致回滚。因为影响可能比错误的数据要广泛得多。因此,清理工作可能会更加困难。

Solr 文档中的指导是使用自动提交。在执行批量操作时尤其如此。如果您要批量编制索引,可能使用多个并行客户端,那么最好每隔一段时间(或每隔这么多文档)自动提交一次。这会导致创建的新索引段更少,从而导致整体索引的碎片更少。

详细信息将取决于您的 Solr 实例上发生的查询和索引操作的组合(以及您的复制方法)。

这里有一篇很好的 Lucidworks 文章: Understanding Transaction Logs, Soft Commit and Commit In SolrCloud

【讨论】:

    【解决方案2】:

    您必须以编程方式处理 SolrJ 中的事务。处理多次写入时。

    1. 使用 SolrServer api add 方法将 SolrInputDoucments 添加到服务器。
    2. 添加完所有 SolrInputDocuments 后,从 SolrServer api 调用 commit 方法来提交所有更改。
    3. 如果 Solr 出现异常,如果您想回滚对 Solr 的写入,请调用 SolServer api 回滚方法。
    4. 如果您还想回滚对数据库的写入,只需从 catch 块中抛出运行时异常。

    这就是我处理事务管理的方式。如果有人有更好的答案,请随时改进答案。

    【讨论】:

    • 如何处理commit抛出异常的情况?对于那些使用@Transaction 注解的人来说,这个失败发生在使用 SolrJ 的方法体之外。
    • 您看到的异常是什么?如果提交失败并出现异常,我们可以捕获异常并调用 Solr 回滚。但请注意,Rollback 将回滚每次调用到最后一次提交。
    • 如果这是针对 web 的,恐怕回滚 api 会撤消整个待处理的文件,而不仅仅是请求中提交的文件。如果有 2 个并行请求并且一个有错误,则另一个请求的文档也可能被撤消。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-30
    • 2017-08-11
    • 2018-04-28
    • 2011-08-04
    • 2018-09-06
    • 1970-01-01
    相关资源
    最近更新 更多