Я пытаюсь найти лучший / оптимальный способ загрузки больших объемов данных из базы данных MySQL в сервис Spring / Hibernate.
Я извлекаю около 100 тыс. Записей из стороннего API (обычно порциями)между 300-1000) Затем мне нужно получить переводы для каждой записи из базы данных, поскольку существует 30 языков, что означает, что в записи будет 30 строк, поэтому 1000 записей из API - это 30000 строк из базы данных.
Записи из API поступают в виде POJO (очень маленького размера), говорят, что я получаю 1000 записей, я делю список на несколько списков по 100 записей, а затем собираю идентификаторы каждой записи и выбираю для этого все переводы из базы данных.запись.Мне нужно только два значения из таблицы, которые я затем добавляю в свои 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);
}
}
}
}
Что касается свойств весенней загрузки / гибернации, у меня установлены только настройки по умолчанию.Я хотел бы сделать это максимально эффективным, быстрым и доступным для памяти.У меня была идея использовать API нижнего уровня вместо Hibernate для обхода сопоставления объектов.