Использование @ Asyn c с методом @Transactional springboot - PullRequest
0 голосов
/ 06 мая 2020

У меня есть метод @ asyn c в моем контроллере Springboot, который вызывает метод обслуживания (asyn c) и выполняет некоторые транзакции БД. Когда этот метод controllers @ asyn c вызывается несколько раз без временной задержки, это приводит к org.hibernate.exception.JDBCConnectionException: невозможно получить JDB C Connection

Controller

 @PostMapping(value = "/api/sms/sendmsgasync")
  public ResponseEntity<Boolean> sendSMSMessageAsync(@RequestBody MessageRequestDto messageRequestDto) {

    final Future<Boolean> booleanFuture = smsService.sendSingleMessageAsync(messageRequestDto, requestContext.getConversationId());
    log.debug("sendSMSMessageAsync {} <<<<", booleanFuture.isDone());
    return ResponseEntity.ok(true);
  }

service

 @Async
  @Override
  public Future<Boolean> sendSingleMessageAsync(MessageRequestDto messageRequestDto, String convId) {


    try {
      sendSingleMessage(messageRequestDto, convId);
    }
    catch (BadRequestException | NotFoundException | TwilioException e) {
      LOG.error("Error in sendSingleMessageAsync. Error logged to SMS Gateway db. Exception '" + e.getMessage() + "'", e);
    }
    return new AsyncResult<>(true);
  }

, который затем вызывает метод sendSingleMessage в том же классе службы, в котором вызывает НЕ транснациональные методы для поиска в базе данных и добавления записи db et c.

Когда эти контроллеры @ asyn c метод вызывается несколько раз без временной задержки, в результате получается

org.springframework.transaction.CannotCreateTransactionException: не удалось открыть JPA EntityManager для транзакции; вложенное исключение - org.hibernate.exception.JDBCConnectionException: Невозможно получить JDB C Соединение в ............... org.springframework.orm.jpa.JpaTransactionManager.doBegin (JpaTransactionManager. java: 400) ... 65 общих кадров пропущено Причина: java. sql .SQLTransientConnectionException: HikariPool-1 - соединение недоступно, запрос истек через 30000 мс. at

Нужно ли мне добавлять ThreadExecutor с методом service @ asyn c?

Я новичок в этом, поэтому любые указатели будут полезны

1 Ответ

0 голосов
/ 18 мая 2020

Скорее всего, причина кроется в одной из двух нижеприведенных причин, учитывая, что БД подключаема:

1) Недостаточный размер пула подключений.
Проверьте значение свойства 1006 * spring.datasource.hikari.maximumPoolSize (по умолчанию 20), чтобы убедиться, что этого числа достаточно. Подумайте, сколько запросов может обрабатываться одновременно в вашем приложении, учитывая, что каждый поток использует собственное соединение.

2) Утечка соединения в вашем приложении.
Убедитесь, что ваши соединения закрыты правильно (в этом случае возвращены в пул). Всегда вызывайте connection.close () в блоке finally или используйте try-with-resources, чтобы избежать утечки исключений.

...