Я запрашиваю репозиторий Spring Data JPA, имеющий около 100К записей, и после извлечения записей я перебираю каждую из них.
Ниже приведен код:
List<RegistrationHistograms> histogramList =
registrationHistoRepository.findStaticRegistrationHistograms();
List<RegistrationHistograms> modifiedList = new ArrayList();
histogramList.forEach(histogram -> {
int totalOrgIdRegistrations =
registrationRepository.findTotalRegistrationByOrganization(histogram
.getOrganizationId());
List<Object[]> topDomainList =
userRepository.countTopDomain(histogram.getOrganizationId());
if (CollectionUtils.isNotEmpty(topDomainList) ||
totalOrgIdRegistrations != 0) {
Object[] topValueArray = topDomainList.get(0);
String topDomain = (String) topValueArray[0];
BigInteger topDomainCount = (BigInteger) topValueArray[1];
int totalDomainRegistration =
registrationRepository.countRegistrationsByEmailDomain(topDomain,
histogram.getOrganizationId());
int topDomainPct = topDomainCount.intValue() * 100 /
totalOrgIdRegistrations;
histogram.setOrganizationId(histogram.getOrganizationId());
histogram.setDomain(topDomain);
histogram.setDomainPercentage(topDomainPct);
histogram.setTotalRegistrations(totalOrgIdRegistrations);
histogram.setTotalDomainRegistration(totalDomainRegistration);
modifiedList.add(histogram);
}
});
batchRepository.bulkSaveOrUpdate(modifiedList);
Используемая сущность:
@Entity
@Table(name = "srs_registration_histogram")
@Getter
@Setter
public class RegistrationHistograms extends BaseEntity {
@Id
@Column(name = "organization_id")
private String organizationId;
@Column(name = "total_registration")
private long totalRegistrations;
@Column(name = "domain_percentage")
private int domainPercentage;
@Column(name = "total_domain_registration")
private long totalDomainRegistration;
@Column(name = "domain")
private String domain;
@Column(name = "is_static_data")
private String isStaticData;
При таком подходе могут возникнуть проблемы с производительностью, учитывая огромный объем данных.
Есть ли способ пакетирования следующего запроса:
List<RegistrationHistograms> histogramList =
registrationHistoRepository.findStaticRegistrationHistograms();
Или вместо того, чтобы делать один за другим, можем ли мы собрать все организационные идентификаторы из histogramList и один раз запросить базу данных registrationRepository для повышения производительности.