1

我们正在 Spring MVC 项目中通过 Spring Data JPA 与 Hibernate 合作,以收集具有以下实体的推文:

  • Tweet:拥有tweet ID,一个@RelatedDocument(Spring Data + MongoDB)和两个与Task和Bigram的多对多关系,是具有persist和merge cascade类型的bigrams的所有者。
  • 任务:与 Tweet 和 Bigram 有一个 Id 和两个多对多关系,并且是两者的所有者,在 tweet 中坚持和合并,在 bigram 中刷新和合并。
  • Bigram:有一个 Id、一个字符串和两个与 Tweet 和 Task 的多对多关系。

我们正在尝试以两种方式处理和存储给定任务的推文:

  • 第一种方式(内存问题),我们处理所有推文如下:

    1. 根据从流 API 接收到的 JSON 创建推文对象。
    2. 获取与推文文本相关的所有二元组并像这样分配它们

      task.getBigrams().add(bigram);
      bigram.getTasks().add(task);
      tweet.getBigrams().add(bigram);
      bigram.getTweets().add(tweet);
      
    3. 一旦处理了二元组,我们将推文对象添加到任务中,反之亦然

      tweet.getTasks().add(task);
      task.getTweets().add(tweet);
      
    4. 最后,当我们处理完所有推文后,我们保存了任务。

如前所述,这种方法的问题是我们无法处理内存中的所有推文,因为一个任务可能运行近 15 分钟,我们可以获得大约 7000 条推文。

  • 第二种方式(性能问题),我们处理所有推文如下:

每当我们处理一条推文时,我们都会保存它,这会导致使用 mongodb 和 mysql 打开多个连接,具有很高的延迟(大约每秒 2-3 条推文)。

所以我们的问题是这样的:

  1. 第二种方法中指定的延迟可能是什么原因?
  2. 在处理大型数据集时,有什么方法可以在不出现内存不足异常的情况下获得高性能?
4

0 回答 0