У меня есть метод @ 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?
Я новичок в этом, поэтому любые указатели будут полезны