Spring + Hibernate加载大量记录

问题描述 投票:0回答:1

我试图找到在Spring / Hibernate服务中从MySQL数据库加载大量数据的最佳/最佳方式。

我从第三方API(通常在300-1000之间的块中)提取大约100k记录然后我需要从数据库中提取每个记录的翻译,因为有30种语言意味着每条记录将有30行,因此来自API的1000条记录是数据库中的30,000行。

来自API的记录以POJO(超小尺寸)的形式表示我得到1000条记录我将列表拆分成多个100条记录列表,然后收集每条记录的id并从数据库中选择所有该记录的翻译。我只需要从表中添加两个值,然后将其添加到我的POJO中,然后将POJO推送到下一个服务。

基本上这个:

interface i18nRepository extends CrudRepository<Translation, Long> {}

List<APIRecord> records = api.findRecords(...);
List<List<APIRecord>> partitioned = Lists.partition(records, 100); // Guava 

for(List<APIRecord> chunk : partitioned) {
  List<Long> ids = new ArrayList();

  for(APIRecord record : chunk) {
    ids.add(record.getId());
  }

  List<Translation> translations = i18Repository.findAllByRecordIdIn(ids);

  for(APIRecord record : chunk) {
    for(Translation translation : translations) {
      if (translation.getRedordId() == record.getId()) {
        record.addTranslation(translation);
      }
    }
  }
}

至于spring-boot / hibernate属性,我只有默认设置。我想尽可能高效,快速和记忆精简。我的一个想法是使用较低层API而不是Hibernate来绕过对象映射。

java mysql spring hibernate spring-data-jpa
1个回答
0
投票

在我看来,你应该绕过JPA / Hibernate进行批量操作。在JPA中无法使批量操作高效。考虑使用Spring的JpaTemplate和本机SQL。

© www.soinside.com 2019 - 2024. All rights reserved.