【问题标题】:query elasticsearch right after saving data with spring can be not up to date?用spring保存数据后立即查询elasticsearch可以不是最新的吗?
【发布时间】:2015-09-17 14:48:39
【问题描述】:

我有以下代码: (线程一次只能访问一个特定 obj 的 synchronized(someObj)。)

@Async
public void funcA() {
 synchronized (someObj) {
      //query (using spring) for **some_data_in_ES**
      //check if **some_data_in_ES** is not 'nothing'
      //update **some_data_in_ES** to be 'A' using spring 
 }
}

@Async
public void funcB() {
 synchronized (someObj) {
      //query (using spring) for **some_data_in_ES**
      //check if **some_data_in_ES** is not 'nothing'
      //update **some_data_in_ES** to be 'B' using spring
 }
}

如果 funcA 控制了 synchronized(someObj) 并将 some_data_in_ES 更新为“A”,并且当 synchronized(someObj) 上的锁定空闲时,funcB 进入 synchronized(someObj) 并检查是否 some_data_in_ES 不是“无”。 是否有可能 B 将得到“无”或 elasticsearch 在更新为“A”后只会返回 some_data_in_ES

【问题讨论】:

  • 你有两个funcA - 第二个应该是“funcB”吗?

标签: java multithreading spring elasticsearch real-time


【解决方案1】:

是否有可能 B 将得到“无”或 elasticsearch 在更新为“A”后只会返回 some_data_in_ES?

是的,B 可以看到“无”或“A”。对 ES 的更新不是原子的。您看到更新的速度取决于 ES 和 Lucene 的配置方式。所以这都是时间和配置的问题。我过去处理问题的一种方法是使用我在 ES 中编制索引的数据库中的 ID。这样我就可以确定它是独一无二的,并且可以轻松编写 upsert 和更新。

查看update API,例如,可能适合使用 upsert。

请阅读near real-time search,了解有关文档何时可见的更多信息。特别注意刷新间隔和刷新 API。

【讨论】:

  • 谢谢!您的信息很有帮助,有助于解决问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
  • 2023-03-15
  • 2014-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-24
相关资源
最近更新 更多