qq_38341585 2024-04-01 16:59 采纳率: 0%
浏览 4

solr根据entity全量更新数据不一致

solr根据entity循环全量更新时solr和数据库数据会不一致是为什么?

for(Stirng entity:entitys){
ModifiableSolrParams params = new ModifiableSolrParams()
                .set("indent", "on")
                .set("wt", "json")
                .set("command",full-import)
                .set("verbose", false)
                .set("clean", false)
                .set("commit", true)
                .set("optimeze", true)
                .set("_", time)
                .set("entity", entity);
 UpdateRequest request = new UpdateRequest("/dataimport");
 request.setParams(params);
 UpdateResponse response = request.process(client, solrCore);
}



  • 写回答

3条回答 默认 最新

  • 码农阿豪@新空间代码工作室 Java领域优质创作者 2024-04-01 17:00
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题描述: 在使用Solr根据entity循环全量更新时,可能会导致Solr和数据库的数据不一致,为什么? 解答: 在使用Solr根据entity循环全量更新时,可能会出现以下几种情况导致Solr和数据库的数据不一致:
    1. 并发更新 当多个线程或进程同时更新同一条数据时,可能会导致数据不一致。比如,当一个线程正在更新某个数据时,另一个线程可能已经更新了该数据,但由于更新操作是异步的,第一个线程可能不知道该数据已经被更新,从而导致数据不一致。为避免这种情况,可以在更新操作前加上同步锁,确保同一时间只有一个线程可以更新该数据。
    2. 数据操作失败 在更新数据时,可能由于网络连接或其他原因导致更新操作失败,这时Solr和数据库的数据就会不一致。为避免这种情况,可以在更新操作时加上重试机制,保证更新操作总是能成功完成。
    3. 误操作或Bug 有时候,可能会由于误操作或程序中的Bug导致Solr和数据库的数据不一致。为避免这种情况,可以在程序中添加断言或日志,确保数据更新的正确性。 示例代码: 以下是一个简单的Java示例代码,在更新数据时使用了同步锁和重试机制,确保数据的正确性:
    public class SolrUpdater {
      private static final int MAX_RETRY = 3;
      private final SolrClient solrClient;
      private final DataSource dataSource;
      public SolrUpdater(SolrClient solrClient, DataSource dataSource) {
        this.solrClient = solrClient;
        this.dataSource = dataSource;
      }
      public void updateEntities(List<String> entities) {
        for (String entity : entities) {
          ResultSet resultSet = null;
          try (Connection connection = dataSource.getConnection()) {
            // synchronize on connection to prevent concurrent updates
            synchronized (connection) {
              // run full-import command
              int retry = 0;
              for (; retry < MAX_RETRY; retry++) {
                try {
                  ModifiableSolrParams params = new ModifiableSolrParams()
                      .set("indent", "on")
                      .set("wt", "json")
                      .set("command", "full-import")
                      .set("verbose", "false")
                      .set("clean", "false")
                      .set("commit", "true")
                      .set("optimize", "true")
                      .set("_", System.currentTimeMillis())
                      .set("entity", entity);
                  UpdateRequest request = new UpdateRequest("/dataimport");
                  request.setParams(params);
                  UpdateResponse response = request.process(solrClient);
                  if (response.getStatus() == 0) { // success
                    break;
                  }
                  // retry after a short delay
                  Thread.sleep(1000);
                } catch (Exception e) {
                  // log error and retry
                  System.err.println("Error updating entity " + entity + ": " + e.getMessage());
                }
              }
              if (retry == MAX_RETRY) {
                System.err.println("Failed to update entity " + entity + " after " + MAX_RETRY + " retries");
              } else {
                // update succeeded, commit changes to database
                connection.commit();
              }
            }
          } catch (SQLException e) {
            System.err.println("Error committing changes: " + e.getMessage());
          }
        }
      }
    }
    
    评论

报告相同问题?

问题事件

  • 创建了问题 4月1日

悬赏问题

  • ¥15 fluent设置了自动保存后,会有几个时间点不保存
  • ¥20 激光照射到四象线探测器,通过液晶屏显示X、Y值
  • ¥15 这怎么做,怎么在我的思路下改下我这写的不对
  • ¥50 数据库开发问题求解答
  • ¥15 安装anaconda时报错
  • ¥20 如何用Python处理单元格内连续出现的重复词语?
  • ¥15 小程序有个导出到插件方式,我是在分包下引入的插件,这个export的路径对吗,我看官方文档上写的是相对路径
  • ¥20 希望有人能帮我完成这个设计( *ˊᵕˋ)
  • ¥100 将Intptr传入SetHdevmode()将Intptr传入后转换为DEVMODE的值与外部代码不一致
  • ¥50 基于ERA5数据计算VPD