Я новичок в Java. Я использую Hibernate и Spring boot.
У меня есть метод ниже, из которого я пытаюсь импортировать файл в таблицу базы данных. Размер файла может быть разным, но иногда его размер составляет 2 ГБ. Он работает нормально, но производительность довольно низкая. Для каждого запуска я пытаюсь проверить файл, существует ли запись isin и techrcrdid в таблице базы данных, и удалить запись, если она существует, и вставить новую.
Я использую метод executeUpdate()
для каждой записи.
private void importFile(Path path) {
this.isEquity = path.getFileName().toString().contains(EQU_FILE_TAG);
if (isEquity) {
List<TransDT> transDT = null;
try {
transDT = estDR.readEquityDeltaFile(path);
} catch (JAXBException | IOException e) {
throw new RuntimeException(e);
}
int i = 0;
for (TransDT trsDTR : transDT) {
EquRD equSecRefeData = null;
if (trsDTR != null) {
deleteEquEntry(trsDTR);
equSecRefeData = estDR.convertEquity(trsDTR);
}
if (equSecRefeData != null) {
sessionFactory.getCurrentSession().persist(equSecRefeData);
}
i++;
if (i % 1000 == 0) {
sessionFactory.getCurrentSession().flush();
sessionFactory.getCurrentSession().clear();
}
if (i % 10000 == 0) {
log.info(i + " Datensätze eingelesen");
}
}
log.info(i + " Datensätze insgesamt in Datei");
}
}
private void deleteEquEntry(TransDT trsDTR) {
Query<?> delete = sessionFactory.getCurrentSession()
.createQuery("delete from EquRD where isin = :isin and techrcrdid = :techrcrdid");
delete.setParameter("isin", trsDTR.getId());
delete.setParameter("techrcrdid", new BigDecimal(trsDTR.getTechRcrdId()));
delete.executeUpdate();
}
Я хотел бы знать, есть ли другой способ, например, с использованием массового метода, где вместо использования метода executeUpdate()
для Каждые записи он сначала прочитает все записи в файле и выполнит запись как массив в таблице базы данных, и как это сделать?