Spring + Hibernate加载大量记录

时间:2019-03-30 14:33:50

标签: java mysql spring hibernate spring-data-jpa

我正在尝试寻找一种在Spring / Hibernate服务中从MySQL数据库加载大量数据的最佳/最佳方式。

我从第三方API中提取大约10万条记录(通常在300-1000之间的块中),然后我需要从数据库中提取每条记录的翻译,因为有30种语言,这意味着每条记录将有30行,因此1000 API中的记录是数据库中的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绕过对象映射。

1 个答案:

答案 0 :(得分:0)

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