Проблема с сохранением Postgresql функций, выполняемых из Spring Boot, - приложение Hibernate - PullRequest
0 голосов
/ 07 мая 2020

Мне нужно выполнить 5 Postgresql функций из задания cron в моем приложении Spring Boot - Hibernate. Если какой-либо из них выйдет из строя, я все равно хочу, чтобы другие функции выполняли и сохраняли изменения. Но теперь, если одна из функций выходит из строя из-за какой-либо ошибки в запросе, никакие изменения не сохраняются. Если не возникает никаких исключений, все изменения отражаются должным образом.

Ниже приведен метод, который вызывается из cron и вызывает 5 методов, выполняющих функции. Код в каждой функции окружен блоком try catch, все еще в случае ошибки для любой из функций, ни одно из изменений не сохраняется, даже если оставшаяся часть выполняется успешно. Чтобы попытаться решить эту проблему, попытался дать @ Transactional для каждой из функций, по-прежнему возникла та же проблема.

@Override
public void sync() {
    accountUpsert();
    patientsToAccountUpsert();
    contactUpsert();
    orderItemUpsert();
    orderUpsert();
}

@Transactional
private void accountUpsert() {
    try {
        doctorProfileRepository.accountUpsert();
        logger.info("DONE: account_upsert");
    } catch (Exception e) {
        logger.error("ERROR: account_upsert");
        logger.error(e.getMessage(), e);
    }
}

@Transactional
private void patientsToAccountUpsert() {
    try {
        doctorProfileRepository.patientsToAccountUpsert();
        logger.info("DONE: patients_to_account_upsert");
    } catch (Exception e) {
        logger.error("ERROR: patients_to_account_upsert");
        logger.error(e.getMessage(), e);
    }
}

@Transactional
private void contactUpsert() {
    try {
        doctorProfileRepository.contactUpsert();
        logger.info("DONE: contact_upsert");
    } catch (Exception e) {
        logger.error("ERROR: contact_upsert");
        logger.error(e.getMessage(), e);
    }
}

@Transactional
private void orderItemUpsert() {
    try {
        doctorProfileRepository.orderItemUpsert();
        logger.info("DONE: orderitem_upsert");
    } catch (Exception e) {
        logger.error("ERROR: orderitem_upsert");
        logger.error(e.getMessage(), e);
    }
}

@Transactional
private void orderUpsert() {
    try {
        doctorProfileRepository.orderUpsert();
        logger.info("DONE: order_upsert");
    } catch (Exception e) {
        logger.error("ERROR: order_upsert");
        logger.error(e.getMessage(), e);
    }
}

Также попытался изменить методы использования EntityManager для выполнения функций, которые все еще получили та же проблема. Ниже показано изменение, внесенное с помощью EntityManager:

@Transactional
private void accountUpsert() {
    try {
        Query query = this.em.createNativeQuery("select  count(*) from salesforce.account_upsert()");
        query.getResultList();
        logger.info("DONE: account_upsert");
    } catch (Exception e) {
        logger.error("ERROR: account_upsert");
        logger.error(e.getMessage(), e);
    }
}

@Transactional
private void patientsToAccountUpsert() {
    try {
        Query query = this.em.createNativeQuery("select  count(*) from salesforce.patients_to_account_upsert()");
        query.getResultList();
        logger.info("DONE: patients_to_account_upsert");
    } catch (Exception e) {
        logger.error("ERROR: patients_to_account_upsert");
        logger.error(e.getMessage(), e);
    }
}

Эта проблема не существует при использовании JdbcTemplate для выполнения функции, как показано ниже:

jdbcTemplate.queryForObject("select salesforce.account_upsert()", Void.class);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...