Spring Boot Rest Api зависает после N параллельных запросов на сохранение - PullRequest
2 голосов
/ 13 мая 2019

Я создаю Rest Api с Spring Boot.Я использую стандартную конфигурацию Hikari, поэтому размер пула 10 подключений.Я столкнулся с ошибкой при попытке отправить 10 параллельных запросов на определенный маршрут.Ошибка говорит: Соединение недоступно, время запроса истекло после 30001 мс. Этот маршрут сохраняет данные в базу данных MySQL, обычно для завершения одной операции сохранения обычно требуется несколько миллисекунд.Почему эта проблема происходит?Должен ли он завершить операцию сохранения, а затем освободить соединение с базой данных для следующей операции?Эта ошибка появляется только при операциях сохранения, когда функция сохранения создает новую сущность.

Свойства

spring.jpa.hibernate.ddl-auto=create-drop
spring.datasource.url=jdbc:mysql://192.168.1.88:3306/question?serverTimezone=UTC
spring.datasource.username=luigi
spring.datasource.password=root

Репозиторий

public interface RandomRepository extends CrudRepository<Random, Integer> {
}

Контроллер

@RestController
public class RandomController {
    private RandomRepository randomRepository;

    public RandomController(RandomRepository randomRepository) {
        this.randomRepository = randomRepository;
    }

    @GetMapping("/")
    public String createRandom() {
        return String.valueOf(Math.random());
    }

    @PostMapping("save")
    public Random save(){
        Random random = new Random();
        random.setNumber(Math.random());

        randomRepository.save(random);

        return random;
    }
}

Я нашел решение, сделав синхронизированный метод .Это правильный путь?Кто-то сталкивался с такой же проблемой?

Возможное решение

@PostMapping("save")
public synchronized Random save(){
    Random random = new Random();
    random.setNumber(Math.random());

    randomRepository.save(random);

    return random;
}

Я ожидал, что операция сохранения будет выполнена легко, но она зависнет, пока не произойдет сбой через 30 секунд

1 Ответ

0 голосов
/ 13 мая 2019

Мы столкнулись с очень похожей проблемой при работе с Spring Boot & Couchbase.

Когда количество запросов было высоким, соединение с БД зависло.

Решение, которое мы использовалидолжен был перейти к вызовам асинхронных методов для всех уровней - от контроллера до операций с БД.

См. этот пост и ответ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...