Мне нужно выполнить 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);