Использование массового исполнения в Java - PullRequest
0 голосов
/ 18 июня 2020

Я новичок в 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() для Каждые записи он сначала прочитает все записи в файле и выполнит запись как массив в таблице базы данных, и как это сделать?

...