有没有一种方法可以优化以下代码。该代码段运行了大约1000次,并且与其他代码段(无法更改)的组合将导致严重的性能问题。
是否有减少数据库操作数量的方法?我将additionalFilesSave放在循环之外,只能执行一次,但是随后创建ProductMAdditionalFilesEntities的部分开始引起附加文件的ID问题(因为未保存文件的ID为0)。
Set<AdditionalFilesEntity> additionalFilesEntities = productEntity.getAdditionalFilesEntities();
if (p.getAdditionalFiles() != null) {
for (AdditionalFile additionalFile : p.getAdditionalFiles()) {
AdditionalFilesEntity additionalFilesEntity = new AdditionalFilesEntity();
if (additionalFile.getFileType().equals("PICTURE")) {
additionalFilesEntity.setFileType(FileTypeEnum.PICTURE);
} else {
additionalFilesEntity.setFileType(FileTypeEnum.FILE);
}
additionalFilesEntity.setFileName(additionalFile.getFileName());
additionalFilesEntity.setFileDescription(additionalFile.getFileDescription());
additionalFilesEntity.setUrl(URLDecoder.decode(additionalFile.getFileUrl()));
additionalFilesEntities.add(additionalFilesEntity);
}
}
additionalFilesRepository.save(additionalFilesEntities);
for (AdditionalFilesEntity additionalFilesEntity : additionalFilesEntities) {
pmf.add(new ProductMAdditionalFilesEntity(productEntity.getId(),
null,
additionalFilesEntity.getId()));
}
答案 0 :(得分:1)
如果选择JdbcTemplate
,则应采用以下常规方法:
使用JdbcTemplate.update()
变体之一插入文件。
使用KeyHolder
获取数据库生成的ID。
使用产品ID和第一步中从数据库获得的ID插入对产品的引用。 如果您的数据库支持merge / upsert语句,则可以在单个语句中完成。 否则,它是两个语句。
这将工作减少到每个文件2-3个语句。
如果您可以使用批量更新,这应该更快。 不幸的是,批量更新don't work well with id generation。 您始终可以将批处理更新用于第二步。 对于第一个,例如,如果您使用UUID,则可能能够在Java端生成ID。