Эффективное объединение двух таблиц с помощью Spring Boot JPA - PullRequest
0 голосов
/ 23 октября 2019

У меня есть две таблицы с некоторыми похожими полями, которые асинхронно заполняются из двух разных API. В каждой таблице есть идентификатор компании и некоторые другие поля. В конце каждого дня я хочу объединить последние данные каждой компании из каждой таблицы.

Я написал следующий код:

if (cmpID == null)
        cmpID = readCompanyTable();


    int pageSize = 1;

    CriteriaBuilder criteriaBuilder = emn.getCriteriaBuilder();

    CriteriaQuery<LegalEntity> criteriaQueryLegal = criteriaBuilder.createQuery(LegalEntity.class);
    Root<LegalEntity> rootLegal = criteriaQueryLegal.from(LegalEntity.class);
    criteriaQueryLegal = criteriaQueryLegal.select(rootLegal);
    criteriaQueryLegal.orderBy(criteriaBuilder.desc(rootLegal.get("timeStamp")));


    CriteriaQuery<PriceRealTimeEntity> criteriaQueryPrice = criteriaBuilder.createQuery(PriceRealTimeEntity.class);
    Root<PriceRealTimeEntity> rootPrice = criteriaQueryPrice.from(PriceRealTimeEntity.class);
    criteriaQueryPrice = criteriaQueryPrice.select(rootPrice);
    criteriaQueryPrice.orderBy(criteriaBuilder.desc(rootPrice.get("dateTime")));


    ArrayList<Long> list = new ArrayList<>();
    list = getCompanyID();

    for (Long com_id : list) {


        Predicate predicateLegal = criteriaBuilder.equal(rootLegal.get("companyID"), com_id);
        criteriaQueryLegal.where(predicateLegal);

        Predicate predicatePrice = criteriaBuilder.equal(rootPrice.get("companyID"), com_id);
        criteriaQueryPrice.where(predicatePrice);

        TypedQuery<LegalEntity> typedQueryLegal = emn.createQuery(criteriaQueryLegal);
        typedQueryLegal.setFirstResult(0);
        typedQueryLegal.setMaxResults(pageSize);

        TypedQuery<PriceRealTimeEntity> typedQueryPrice = emn.createQuery(criteriaQueryPrice);
        typedQueryPrice.setFirstResult(0);
        typedQueryPrice.setMaxResults(pageSize);

        List<LegalEntity> resultsLegal = typedQueryLegal.getResultList();
        List<PriceRealTimeEntity> resultsPrice = typedQueryPrice.getResultList();
        if ( (resultsLegal.isEmpty()) || (resultsPrice.isEmpty()))
            continue;
        try {
        DailyEntity den = new DailyEntity(resultsPrice.get(0), resultsLegal.get(0),
                cmpID.get(Long.valueOf(com_id)).doubleValue(),  addr_data.get(1));
        drep2.save(den);

        } catch (Exception e) {

        }
    }

Сначала я получаю список компанийИдентификаторы из таблицы. Создавайте параллельные запросы и объединяйте данные. Я знаю, что этот метод очень интуитивен и тривиален, и я ищу лучшее решение. Этот метод очень очень медленный.

Еще одно примечание: я измерил продолжительность работы каждого блока кода. Эта часть:

        List<LegalEntity> resultsLegal = typedQueryLegal.getResultList();
        List<PriceRealTimeEntity> resultsPrice = typedQueryPrice.getResultList();

занимает около 0,5 секунды для запуска. Это очень медленно.

1 Ответ

0 голосов
/ 23 октября 2019

Вы можете воспользоваться преимуществами выполнения JPA Batch для повышения производительности.

Пожалуйста, обратитесь к здесь , чтобы узнать, как сделать то же самое.

...