我试图找到在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来绕过对象映射。
在我看来,你应该绕过JPA / Hibernate进行批量操作。在JPA中无法使批量操作高效。考虑使用Spring的JpaTemplate和本机SQL。