我正在尝试寻找一种在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绕过对象映射。
答案 0 :(得分:0)
我认为,您应该绕过JPA / Hibernate进行批量操作。 在JPA中无法使批量操作高效。 考虑使用Spring的JpaTemplate和本机SQL。